2012-10-24 37 views
9

प्रश्नबाहरी PHP स्क्रिप्ट से जूमला सत्र चर लिखते/पढ़ने के दौरान दौड़ की स्थिति को कैसे रोकें?

  • सत्र डेटा होने की संभावना के बीच-बीच में नुकसान है एक रेस स्थिति की वजह से? यदि नहीं, तो क्या समस्या होने की संभावना है?
  • बाहरी php स्क्रिप्ट से जूमला सत्र चर लिखते/पढ़ने के दौरान मैं दौड़ की स्थिति को कैसे रोक सकता हूं?

विवरण

मैं उपयोग कर रहा हूँ

  • जूमला 2.5
  • पीएचपी 5.4.3
  • अपाचे 2.2.22
  • mysql 5.5.24
  • wampserver स्थानीयहोस्ट पर 2।
  • मेरी लिपि जूमला से बाहर है।
  • (cometchat संस्करण 3.0.1)

स्क्रिप्ट अतुल्यकालिक ajax अनुरोध उपयोग कर रहा है पाने के लिए और सेट जूमला चर कई बार। सत्र में संग्रहीत डेटा एक सरणी है। अंततः कुछ सरणी डेटा गायब हो जाता है। उपयोगकर्ता लॉग इन करने और स्क्रिप्ट का उपयोग करने के बाद ऐसा लगता है कि यह अधिक लगातार होता है।

ईमानदार होने के लिए, मुझे सच में यकीन नहीं है कि समस्या क्या है, लेकिन मुझे लगता है कि मेरा कोड दौड़ की स्थिति से पीड़ित है। मुझे लगता है कि जूमला लिखित होने से पहले सत्र की जानकारी पढ़ने की कोशिश कर रहा है या यह सिर्फ सेट नहीं हो रहा है। गायब होने वाली जानकारी यादृच्छिक रूप से चुनी जाती है और डेटा की हानि अंतःस्थापित होती है।

SCRIPT1

स्क्रिप्ट 1 एक अतुल्यकालिक ajax अनुरोध उपयोग कर रहा है/सेट जूमला सत्र चर प्राप्त करने के लिए। इसे कई बार बुलाया जाएगा। डिज़ाइन के कारण, एजेक्स प्रतिक्रिया सफल होने तक स्क्रिप्ट 1 को तब तक नहीं बुलाया जा सकता है।

$.ajax(
      { cache:false, 
       url: 'script2.php', 
       data: { 'change': change},    
       dataType: 'json',    
       success: function(data) 
       { 
        //do something 
       } 
      }); 

यह जूमला तक पहुंचने और सत्र डेटा प्राप्त करने के लिए स्क्रिप्ट 2 में उपयोग किए जाने वाले कोड का एक अंदाजा विचार है।

SCRIPT2

<?php 
//some code omitted for brevity 

$app = &JFactory::getApplication('site');/ 
$app->initialise();      

$nottimedout=false; 
$session = JFactory::getSession(); 
$jquizstart = date('Y-m-d H:i:s', time()); //<<-- time of access  
$nottimedout = $session->has('jtimedout'); 

if ($nottimedout==true) 
{ 
    $jqid = $session->get('jqid');    //<<-- get array from session 
    if (isset($_GET['change'])) 
    { 
     $qnumber=$_GET['change']; 
     $firephp->log($qnumber, 'qnumber'); 
     $jqid[$qnumber][3]=$jquizstart;  //<<-- add time of access to array 
     $firephp->log($jqid[$qnumber][3], '$jqid[$qnumber][3]'); 
     $session->set('jqid', $jqid);  //<<-- store array in Joomla with updated data 
    } 
    else 
    { 
     $firephp->log('CHANGE NOT SET'); 
    } 

    echo json_encode(
         array("nottimedout" => $nottimedout) 
        );     
} 
else 
{ 
    //Do something 
} 
?> 

दौड़ की स्थिति

के लिए टेस्ट मैंने सोचा था कि डेटा ओवरराइट हो रही हो सकता है, तो मैं नीचे दिए गए कोड का उपयोग कर एक त्वरित परीक्षण किया था। प्रत्येक बार जब मैं सत्र सरणी अद्यतन करता हूं तो मैं केवल अद्यतन डेटा के साथ एक नया सत्र चर बना देता हूं।

$qnum[$qnumber]=$jquizstart; 
$session->set('var'.$qnumber, $qnum); 

वेबसाइट को अपडेट करने के बाद एक और स्क्रिप्ट में मैंने प्रत्येक व्यक्तिगत सत्र की जांच की कि वे सेट किए गए हैं या नहीं।

//Test for race condition in Joomla session 

     for ($counter=0; $counter<=$totalnumber-1; $counter++) 
     { 
      $racecondition=$session->get('var'.$counter);    
      $firephp->log($racecondition, 'var'.$counter.'='); 
     } 

टेस्ट

jqid से लापता सरणी जानकारी भी इसी व्यक्तिगत सत्र (बस अपडेट किए गए डेटा के साथ सत्र) से लापता था के परिणामों तो ऐसा लगता है कि यह एक समस्या नहीं है डेटा ओवरराइट किया जा रहा है। मुझे यकीन नहीं है कि यह दौड़ की स्थिति को खराब करता है या नहीं।

किसी भी सुझाव के बारे में कोई सुझाव जो आप सोच रहे हैं और इसे कैसे ठीक किया जाए, इसका स्वागत किया जाएगा।

संपादित

कैसे जूमला में दौड़ की स्थिति को रोकने के लिए पर भी सामान्यीकृत जवाब स्वागत है। धन्यवाद

EDIT2

मैं अगर यह php5.4 और जूमला के साथ एक समस्या नहीं है आश्चर्य शुरू कर रहा हूँ। मैंने सुना है कि वे एक साथ अच्छी तरह से नहीं खेलते हैं और मुझे php5.3 से अपडेट करने से पहले मुझे यह समस्या याद नहीं है। मुझसे गलती भी हो सकती है।

EDIT3

मैं दिमागी अंत में कर रहा हूँ। मैंने PHP 5.3.10 के साथ एक अलग सर्वर पर वेबसाइट स्थापित की। मैंने इसे अनलॉक किए गए उपयोगकर्ता के रूप में दस या अधिक बार कोशिश की। डेटा का कोई नुकसान नहीं हुआ। फिर मैंने जूमला में लॉग इन किया और लगभग हर बार जब मैं पृष्ठ तक पहुंचा तो डेटा खो गया था। अगर मुझे केवल जूमला सत्रों का उपयोग नहीं करना पड़ेगा! GRRRrrrrr

EDIT4

अब हताश हो रही है और कुछ भी कोशिश कर रहा। JRequest काम नहीं किया, हालांकि मुझे इसका उपयोग करना चाहिए।

चूंकि लॉग इन होने पर समस्या अधिक बार होती है, इसलिए मुझे लगा कि यह होना चाहिए क्योंकि सत्र में उपयोगकर्ता द्वारा अतिथि होने पर बहुत अधिक सामग्री संग्रहीत होती है। Jqid एक बड़ी सरणी है, इसलिए इसे हर समय अद्यतन करने के बजाय, मैंने कई छोटे सरणी बनाने और उचित होने पर प्रत्येक को अपडेट करने का प्रयास किया। इसका बिल्कुल कोई प्रभाव नहीं पड़ा। फिर, मुझे शायद वैसे भी ऐसा करना चाहिए।

EDIT5B

एक अस्थायी समाधान खोजने के लिए प्रयास करते समय, मैं परीक्षण करने के लिए है कि क्या सत्र सफलतापूर्वक या नहीं अद्यतन किया था (यह एक ही स्क्रिप्ट है कि सत्र अद्यतन में किया गया था) की कोशिश की।

यहां कोड है जिसे मैंने जस्टार्ट की जांच करने के लिए उपयोग किया था।

//jstart updated 
$session->close('jstart'); 
$try_again_session = JFactory::getSession(); 
$newjstart=$try_again_session->get('jstart'); 
$firephp->log($newjstart[$qnumber], 'confirm_jstart_set='); 

दिलचस्प बात मैंने पाया कि, jstart जांच के दौरान अद्यतन जानकारी निहित था, लेकिन पूरा होने पर यह याद आ रही थी। मुझे सच में यकीन नहीं है कि इसका क्या अर्थ है, लेकिन मुझे लगता है कि अगर हमने एक चर के रूप में JFactory::getSession() का इलाज किया है तो चर केवल इस स्क्रिप्ट के लिए अपडेट किया गया था (एक स्थानीय चर की तरह?), JFactory::getSession() के लिए डेटाबेस मान जो भी कारण नहीं था डेटाबेस में लिखा है। इस प्रकार बाद में, जब इस स्क्रिप्ट को फिर से निकाल दिया गया तो यह JFactory::getSession() का पुराना मान पुनर्प्राप्त किया गया जो डेटाबेस में सहेजा गया था।

अभी भी पता नहीं है कि सत्र को डेटाबेस में क्यों नहीं लिखा जा रहा है।

+2

isset उपयोग getvar का उपयोग नहीं करते काफी उपयोगी इस वेबसाइट पाया $ परिवर्तन = JRequest :: getVar ("बदलें", 'मान अगर परिवर्तन मौजूद नहीं है'); वैसे भी मेरा पहला विचार था। –

+0

अच्छा बिंदु। मैं अब से इसका उपयोग करूंगा। – TryHarder

उत्तर

2

अंततः ऐसा लगता है कि मुझे समाधान मिला है!

मैं apache_error.log में त्रुटि लॉग (WAMP/लॉग/apache_error.log) इस तरह के

PHP Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at Z:\\libraries\\joomla\\session\\session.php:96) in Z:\\libraries\\joomla\\session\\session.php on line 532, referer: http://localhost/cq 
PHP Warning: Cannot modify header information - headers already sent by (output started at Z:\\libraries\\joomla\\session\\session.php:96) in Z:\\cometchat\\cometchatcss.php on line 68, referer: http://localhost/cq 
PHP Warning: session_destroy(): Session object destruction failed in Z:\\libraries\\joomla\\session\\session.php on line 96, referer: http://localhost/cq 

के रूप में सत्र से संबंधित त्रुटियों की एक टन थे cometchat को बंद करने और सर्वर मैं रिबूट करने के बाद जांच करने के लिए हुआ पाया कि intermittent सत्र डेटा हानि रोकने के लिए लग रहा था। परिवर्तन के बाद apache_error.log

चूंकि समस्या अस्थायी है, इसलिए मुझे 100% यकीन नहीं है कि यह हल हो गया है, लेकिन मुझे पूरा भरोसा है कि मैंने इसे समाधान के रूप में लिखा है। मैं

उपयोग कर रहा था cometchat 3.0.1 संस्करण

मैं यह परीक्षण रख रहा हूँ। अगर समाधान बढ़ता है तो मैं धूमकेतु के एक अद्यतन संस्करण का प्रयास करूंगा और परिणाम पोस्ट करूंगा।

अद्यतन: ऐसा लगता है कि यह धूमकेतु से संबंधित प्रतीत होता है। मैंने नवीनतम संस्करण 4.6.0 स्थापित किया है, लेकिन सत्र हानि अभी भी हो रही है। मैं अपनी स्क्रिप्ट वाले पृष्ठों पर धूमकेतु को छोड़कर इसके आसपास काम कर सकता हूं।

उपयोगी जानकारी: शायद ज़रुरत पड़े किसी और खुद को जूमला के साथ संघर्ष कर पाता सत्र-मैं http://tutsforu.com/joomla-module-tutorial/8-joomla-tutorial/75-using-session-in-joomla.html

विशेष रूप

$session->getId(); 
$session->get('session.counter'); 
$session->isNew(); 
$session->getName(); 
$session->getState(); 
$session->getExpire(); 
जूमला के साथ
3

जबकि मुझे समस्या का समाधान नहीं मिला है, मुझे एक काम मिल गया है। यह अच्छा नहीं है, लेकिन यह काम करता है। जब भी सत्र चर अद्यतन किया जाता है, तो कुकी में जानकारी को बैकअप के रूप में संग्रहीत किया जाता है। बाद में लिपि में, जांच करें कि क्या आवश्यक जानकारी के रूप में कुकी से जानकारी गायब है और अपडेट है।

मैं इसे इस तरह से नहीं करना चाहूंगा, लेकिन ऐसा लगता है कि मेरे पास कोई विकल्प नहीं है।