2012-12-19 10 views
5

मान लीजिए कि हम कुछ ताला स्क्रिप्ट हम यकीन है कि दो लिपियों कभी नहीं एक ही समय में चल रहे हैं कि आवश्यकता है प्रतीत होता है पहर। ऐसा लगता है कि file_get_contents() के परिणाम कैश किए गए हैं?file_get_contents कैशिंग, ताला स्क्रिप्ट मुद्दा

इसे कैसे ठीक करें? मैं फ़ाइलों का उपयोग करना चाहता हूं, डीबी नहीं।


संपादित करें: मैं पहले से ही मैं अभी भी उत्सुक हूँ लॉक-स्क्रिप्ट (लेवी मॉरिसन के लिए धन्यवाद) flock() का उपयोग कर

करना करने में कामयाब रहे वैसे भी क्यों इतनी अप्रत्याशित व्यवहार में file_get_contents काम करता है?

+3

देखें [झुंड] (http://php.net/manual/en/function.flock.php)। –

+0

कोई कैशिंग नहीं होना चाहिए। मैं सिर्फ उत्सुक हूं, क्या होता है जब आप फ़ाइल में मैन्युअल रूप से कुछ लिखते हैं और अपनी स्क्रिप्ट चलाते हैं? – Ranty

+0

@ लेवी मॉरिसन अच्छा दिखता है, लेकिन 'file_get_contents() 'के बारे में क्या? – Peter

उत्तर

2

मैं इसे पुन: उत्पन्न करने और समस्या को समझने में सक्षम था। सबसे पहले यह आपके द्वारा वर्णित तरीके से देखा गया: मैंने ब्राउज़र में स्क्रिप्ट का अनुरोध किया और जब यह चल रहा था, मैंने फ़ाइल सामग्री की जांच की - यह busy! था। फिर मैं दूसरी स्क्रिप्ट चलाता हूं और ब्राउज़र में यह लोडिंग था, जैसा कि पहले वाला था। मैंने सोचा कि यह भी चल रहा है, लेकिन यह नहीं था।

अगर busy! के बजाय आप कुछ यादृच्छिक, की तरह जोड़ने यह आंकड़ा बहुत आसान है: एक ही दो स्क्रिप्ट चलाने के लिए उसी तरह

file_put_contents('test.txt', 'busy washing ' . (mt_rand(1, 999) * 99999) . ' dishes'); 

और फ़ाइल की सामग्री की निगरानी। सबसे पहले, यह पहली लिपि लिखी जाएगी। busy washing 1 dishes कहें। फिर आप दूसरी स्क्रिप्ट लिखने के लिए सामग्री में परिवर्तन देखेंगे, संख्या अलग होगी।

असल में, दूसरी स्क्रिप्ट प्रतीक्षा करता है जबकि पहला एक समाप्त होता है और केवल तब शुरू होता है। परिष्कृत करने के लिए पर्याप्त मजेदार, पहली स्क्रिप्ट फ़ाइल को साफ़ करती है, जो दूसरी स्क्रिप्ट को सामान्य रूप से चलाने देती है, लेकिन यह ब्राउज़र में दिखती है जैसे कि वे दोनों एक ही समय में काम कर रहे हैं। असल में, दूसरी स्क्रिप्ट पहले के रूप में दो गुना अधिक समय तक चलती है।

मुझे AJAX के माध्यम से भारी एसिंक्रोनस अनुरोध करते समय उस व्यवहार का सामना करना पड़ा और एक अन्य ब्राउज़र टैब में एक ही वेबसाइट पेज का अनुरोध करना पड़ा। जब तक स्क्रिप्ट खत्म नहीं हो जाती तब तक मैं टैब लोड नहीं कर सका।

इतनी लंबी कहानी छोटी है, कोई समस्या नहीं है! यदि आप क्रॉन के माध्यम से उस स्क्रिप्ट को कतारबद्ध करते हैं तो उन्हें अलग से चलाया जाएगा और दूसरा यह पता लगाकर खत्म होगा कि फ़ाइल खाली नहीं है।

+0

और यदि आप पंक्ति में दो बार समान संख्या उत्पन्न करते हैं? –

+0

@ लेवीमोरीसन यह दिखाने के लिए संख्या है कि समस्या मौजूद नहीं है। लॉकिंग फ़ाइल के साथ इसका कोई लेना-देना नहीं है, खासकर 'if (file_get_contents (' test.txt ') के संदर्भ में) {} ' – Ranty

+0

@ रांति हां यह है। कंसोल के माध्यम से सबकुछ ठीक है – Peter

संबंधित मुद्दे