2010-07-21 9 views
7

मेरे पास एक सवाल है कि PHP फाइल सिस्टम ऑपरेशंस को कैसे संभालता है। मैं यह कोड चला रहा हूं जो इसे इस्तेमाल होने से पहले बनाई जा रही फ़ाइल पर निर्भर करता है, और ऐसा लगता है कि जब मैं कोड चलाता हूं तो यह दौड़ की स्थिति बन जाता है - कभी-कभी यह काम करता है, फ़ाइल बनाई जाती है और PHP कोड इसका उपयोग करता है, कभी-कभी विफल रहता है।क्या पीएचपी आगे बढ़ने से पहले फाइल सिस्टम ऑपरेशंस (जैसे file_put_contents) के लिए इंतजार कर रहा है?

तो मैं सोच रहा था कि php फाइल सिस्टम ऑपरेशंस को कैसे संभालता है, क्या यह पृष्ठभूमि में इसे भेजता है या ऑपरेशन पूरा होने तक प्रतीक्षा करता है?

+2

'अवरुद्ध' वह शब्द है जिसमें आप रुचि रखते हैं। अवरोधन संचालन आपके प्रोग्राम को पूरा होने तक प्रतीक्षा (या 'ब्लॉक') का कारण बनता है। गैर-अवरुद्ध या असीमित परिचालन वे हैं जिन्हें 'पृष्ठभूमि में बंद' भेजा जाता है :) – meagar

उत्तर

6

हाँ, जब तक आप एक फ़ाइल हैंडल खोलें और फिर गैर अवरुद्ध मोड पर सेट करें: stream_set_blocking()

+2

यह वास्तव में सच नहीं है। यदि आप खोलते हैं और बस (एफ) इसे लिखते हैं, तो डेटा डिस्क पर नहीं लिखा जाता है। यदि fwrite सी फ़ंक्शन फ़्राइट का उपयोग करता है, तो उच्च अवसर के साथ डेटा ऑपरेटिंग सिस्टम तक भी नहीं पहुंचता है। जैसा कि @ मैट्ट्यू फ्लैंचन ने बताया, डेटा केवल फ्लेक्ज़ और एफएफएलयूश के दौरान डिस्क पर फिसल गया है। – dmeister

+0

@ircmaxell, उत्तर को विस्तार की आवश्यकता है। – Pacerier

3

PHP प्रक्रिया पूरी होने तक प्रतीक्षा करनी चाहिए। लेकिन यह नहीं जानते कि आप संचालन को कैसे कार्यान्वित कर रहे हैं, यह कहना मुश्किल है। यदि आप एक उदाहरण कोड पोस्ट कर सकते हैं जिसका उपयोग आप कर रहे हैं तो यह सहायक होगा ताकि हम यह पता लगाने में आपकी सहायता कर सकें कि यह ठीक से काम क्यों नहीं कर रहा है।

+0

चाहिए, लेकिन यह सच नहीं है। मुझे बस समस्या थी जहां फ़ाइलों को संसाधित करने के लिए कोड के दूसरे सेट से पहले पूरी तरह से लिखा नहीं गया था, जिसके कारण अजीब समस्या –

8

file_put_contentsfopen, fwrite, fclose के बराबर है। fclose यह सुनिश्चित करना चाहिए कि फ़ाइल डिस्क पर पूरी तरह से फ़्लश हो।

+3

असल में, यह सुनिश्चित करने का एकमात्र तरीका है कि फ़ाइल पूरी तरह से डिस्क पर फिसल गई है ड्राइव पर लिखने के माध्यम से कैशिंग को बंद करना। अन्यथा, आप यह बता सकते हैं कि फाइल सिस्टम ने लिखने के आदेश जारी किए हैं, न कि वास्तव में लेखन डिस्क पर सफलतापूर्वक प्रतिबद्ध किया गया था ... – ircmaxell

+0

क्या 'LOCK_EX' ध्वज इसे हल करता है? http://php.net/manual/en/function.file-put-contents.php – martin

2

वर्ष 2013, सीपीएनल के साथ मेरे सामान्य उद्यान विविधता लिनक्स वीपीएस पर, डिफ़ॉल्ट सेटिंग्स के साथ, PHP 5.2.17 के साथ, file_put_contents हमेशा छोटी स्ट्रिंग लंबाई के लिए ~ 5ms लेता है।

आकस्मिक रूप से 5ms उच्च गुणवत्ता वाले एचडीडी के पूर्ण प्रतिबद्ध लेखन समय के बारे में है।

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND); 

यह लगातार ~ 5ms लेता है। ऐसा लगता है कि 'अवरुद्ध' और 'फ्लशिंग' शामिल है। तो, file_put_contents की गति के बारे में सोच कम से कम 5ms/आम सर्वर 2013 04.

आप कुछ प्रवेश के लिए उदाहरण के लिए गति की जरूरत है, पर आपरेशन उन लोगों के लिए, @Matthew Flaschen ने कहा:

file_put_contents is equivalent to fopen, fwrite, fclose. 
fclose should ensure the file is fully flushed to disk. 

फिर एक की जरूरत है :

function file_put_contents_fast() {...no fclose...} 

लेकिन यह पता लगाने के लिए कुछ शोध लेगा कि फाइल हैंडल कब खुलती हैं तो क्या होता है। Php closes them at exit, लेकिन क्या यह वास्तव में हर समय ऐसा करता है? भले ही यह दुर्घटनाग्रस्त हो? क्या होता है यदि क्रैश के बाद php द्वारा फ़ाइल खोल दी जाती है? इत्यादि। PHP मैनुअल रीडिंग और गूगलिंग के 30 मिनट के बाद, इस तरह के और इसके परिणामों का कोई उल्लेख नहीं था।

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