प्रश्नबाहरी 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()
का पुराना मान पुनर्प्राप्त किया गया जो डेटाबेस में सहेजा गया था।
अभी भी पता नहीं है कि सत्र को डेटाबेस में क्यों नहीं लिखा जा रहा है।
isset उपयोग getvar का उपयोग नहीं करते काफी उपयोगी इस वेबसाइट पाया $ परिवर्तन = JRequest :: getVar ("बदलें", 'मान अगर परिवर्तन मौजूद नहीं है'); वैसे भी मेरा पहला विचार था। –
अच्छा बिंदु। मैं अब से इसका उपयोग करूंगा। – TryHarder