2012-03-25 12 views
7

मेरे पास एक फ़ाइल है जिसे मैं लिख रहा हूं, लेकिन मुझे इसे किसी अन्य स्क्रिप्ट को लिखने से रोकने के लिए इसे पहले लॉक करने की आवश्यकता है (flock() का उपयोग करके)। तो मेरे पास है:जांचें कि क्या फ़ाइल पहले से ही झुंड() का उपयोग कर बंद कर दी गई है?

$file=fopen($file_p); 

if (flock($file, LOCK_EX)) {//lock was successful 
    fwrite($file,$write_contents);   
} 

लेकिन मैं अगर यह पहले से ही बंद है की जाँच करने के लिए, यह करने के लिए लिखने से अन्य लिपियों को रोकने के लिए की जरूरत है।

मैं यह कैसे कर सकता हूं?

उत्तर

-1

मैं देखने के लिए अगर मैं फाइल पर एक ताला प्राप्त नहीं कर सकता है की जाँच करेगा की तरह, इस:

if (!flock($file, LOCK_EX)) { 
    throw new Exception(sprintf('Unable to obtain lock on file: %s', $file)); 
} 

fwrite($file, $write_contents); 
+1

यह गलत है। यदि आप फ़्लॉक पर पास किए गए ऑपरेशन पर 'LOCK_NB' बिटमास्क निर्दिष्ट नहीं करते हैं, तो * डिफ़ॉल्ट रूप से, यह फ़ंक्शन तब तक अवरुद्ध होगा जब तक अनुरोधित लॉक अधिग्रहित नहीं किया जाता है * ([स्रोत] (http://www.php.net// मैनुअल/en/function.flock.php))। आपके द्वारा दिए गए उदाहरण कोड के साथ, 'फ्लॉक' * किसी भी प्रक्रिया द्वारा फ़ाइल पर लॉक को इंगित करने के लिए झूठी वापसी नहीं होगी, लेकिन यह तब तक प्रतीक्षा करेगा जब तक कि उस प्रक्रिया को लॉक जारी नहीं किया जाता है। –

+0

@ मार्क आर्मरी: गलत कैसे? तर्क सरल है, अगर आप फ़ाइल पर 'अनन्य लॉक' प्राप्त नहीं कर सकते हैं, तो अपवाद फेंक दें। अपवाद को संभालने के तरीके को समझने के लिए यह कॉलिंग कोड पर निर्भर है। –

+0

नहीं - इस मामले में कि लॉक प्राप्त करने में असमर्थ होने का कारण यह है कि एक और प्रक्रिया इसे रखती है, ऊपर दी गई आपकी टिप्पणी मेल नहीं खाती है कि आपका कोड कैसा व्यवहार करता है। इसके बजाय आपके कोड का व्यवहार यह है कि "यदि आप फ़ाइल पर एक विशेष लॉक प्राप्त नहीं कर सकते हैं, तब तक प्रतीक्षा करें जब तक आप कर सकें, फिर जारी रखें।" - यह 'झुंड' का डिफ़ॉल्ट व्यवहार है। आपको रायन वाई के उत्तर में दिखाए गए अनुसार 'LOCK_NB' संशोधक का उपयोग करने की आवश्यकता है, ताकि आपका कोड उस तरीके से व्यवहार कर सके जिसकी आपकी टिप्पणी का वर्णन किया गया है। –

-1

आपका फ़्लॉक कॉल यह देखने के लिए चेक है कि यह पहले से लॉक है या नहीं। यह बंद है, तो यह है कि अगर() बयान, विफल हो जाएगा तो आप सिर्फ एक किसी और उस पर की तरह कुछ के साथ फेंक सकता है:

if (flock($file, LOCK_EX)) {//lock was successful 
    fwrite($file,$write_contents); 
} else { 
    echo "$file is locked."; 
} 
+0

एएचएचएच, तो फ़ाइल को पहले से लॉक होने पर यह झूठा हो जाता है? –

+1

यह गलत है; माइक पर्ससेल के सुंदर-समान-समान उत्तर पर मेरी टिप्पणी देखें। –

14

docs में वर्णित है, LOCK_NB का उपयोग एक गैर अवरुद्ध ताला प्राप्त करने के लिए प्रयास करने के लिए है, और विफलता पर $wouldblock तर्क जाँच देखने के लिए अगर कुछ और ताला आयोजित करता है।

if (!flock($fp, LOCK_EX|LOCK_NB, $wouldblock)) { 
    if ($wouldblock) { 
     // something already has a lock 
    } 
    else { 
     // couldn't lock for some other reason 
    } 
} 
else { 
    // lock obtained 
} 
संबंधित मुद्दे