मेरे पास एक फ़ाइल है जिसे मैं लिख रहा हूं, लेकिन मुझे इसे किसी अन्य स्क्रिप्ट को लिखने से रोकने के लिए इसे पहले लॉक करने की आवश्यकता है (flock()
का उपयोग करके)। तो मेरे पास है:जांचें कि क्या फ़ाइल पहले से ही झुंड() का उपयोग कर बंद कर दी गई है?
$file=fopen($file_p);
if (flock($file, LOCK_EX)) {//lock was successful
fwrite($file,$write_contents);
}
लेकिन मैं अगर यह पहले से ही बंद है की जाँच करने के लिए, यह करने के लिए लिखने से अन्य लिपियों को रोकने के लिए की जरूरत है।
मैं यह कैसे कर सकता हूं?
यह गलत है। यदि आप फ़्लॉक पर पास किए गए ऑपरेशन पर 'LOCK_NB' बिटमास्क निर्दिष्ट नहीं करते हैं, तो * डिफ़ॉल्ट रूप से, यह फ़ंक्शन तब तक अवरुद्ध होगा जब तक अनुरोधित लॉक अधिग्रहित नहीं किया जाता है * ([स्रोत] (http://www.php.net// मैनुअल/en/function.flock.php))। आपके द्वारा दिए गए उदाहरण कोड के साथ, 'फ्लॉक' * किसी भी प्रक्रिया द्वारा फ़ाइल पर लॉक को इंगित करने के लिए झूठी वापसी नहीं होगी, लेकिन यह तब तक प्रतीक्षा करेगा जब तक कि उस प्रक्रिया को लॉक जारी नहीं किया जाता है। –
@ मार्क आर्मरी: गलत कैसे? तर्क सरल है, अगर आप फ़ाइल पर 'अनन्य लॉक' प्राप्त नहीं कर सकते हैं, तो अपवाद फेंक दें। अपवाद को संभालने के तरीके को समझने के लिए यह कॉलिंग कोड पर निर्भर है। –
नहीं - इस मामले में कि लॉक प्राप्त करने में असमर्थ होने का कारण यह है कि एक और प्रक्रिया इसे रखती है, ऊपर दी गई आपकी टिप्पणी मेल नहीं खाती है कि आपका कोड कैसा व्यवहार करता है। इसके बजाय आपके कोड का व्यवहार यह है कि "यदि आप फ़ाइल पर एक विशेष लॉक प्राप्त नहीं कर सकते हैं, तब तक प्रतीक्षा करें जब तक आप कर सकें, फिर जारी रखें।" - यह 'झुंड' का डिफ़ॉल्ट व्यवहार है। आपको रायन वाई के उत्तर में दिखाए गए अनुसार 'LOCK_NB' संशोधक का उपयोग करने की आवश्यकता है, ताकि आपका कोड उस तरीके से व्यवहार कर सके जिसकी आपकी टिप्पणी का वर्णन किया गया है। –