2012-08-05 16 views
7

मैं लोगों को इस तरह झुंड का उपयोग करके देखphp झुंड और fread और fwrite

if (!$fp = @fopen($file_name, 'rb')) 
{ 
    return FALSE; 
} 

flock($fp, LOCK_SH); 

$data = ''; 

if (filesize($file_name) > 0) 
{ 
    $data = unserialize(fread($fp, filesize($file_name))); 
} 

लेकिन है नहीं इस बात की संभावना है कि किसी के बीच फाइल को संपादित होगा fopen कॉल और flock कॉल? और fread


संपादित करें के लिए एक ही प्रश्न: 20 से लोगों
स्पष्ट करने के लिए कारण है कि मैं इस पूछ रहा हूँ ... मैं कोड here, एक mysql कैशिंग स्थिति में पर मेरे सवाल आधारित रहा हूँ, क्या रोकने के लिए सभी एक ही समय में फ़ाइल तक पहुंचने में सक्षम हैं अगर वे सभी फॉपेन और झुंड के बीच में आ सकते हैं?

क्या यह कोड मूर्ख है?

उत्तर

6

टिप्पणी में समझाया आप से पूछना:

इस बात की संभावना है कि नहीं है कोई अन्यथा फॉपेन कॉल और फ्लॉक कॉल के बीच फ़ाइल को संपादित करेगा? और फ्रेड

हाँ, नहीं, शायद। संक्षिप्त उत्तर: "हां" मानें और ध्यान से कार्य करें।

हां, उस पारंपरिक झुंड() - आधारित लॉकिंग में केवल सलाहकार है, इसलिए अन्य प्रक्रियाएं (या यहां तक ​​कि एक ही प्रक्रिया) ताले की अवहेलना करने के लिए स्वतंत्र हैं। व्यवहार में, यह कोई समस्या नहीं है, क्योंकि फ़्लॉक() का उपयोग अच्छी तरह से व्यवहार किए गए क्लाइंट कोड द्वारा किया जाता है - जब तक आप LOCK_SH प्राप्त नहीं करते हैं तब तक आप तब तक नहीं पढ़ते हैं, और जब तक आप LOCK_EX - एप्लिकेशन पर प्राप्त नहीं करते हैं तब तक आप तब तक नहीं लिखते- विशिष्ट फाइलें

नहीं है, झुंड की है कि PHP के क्रियान्वयन में() अनिवार्य कुछ ऑपरेटिंग सिस्टम पर, documentation प्रति है, जो भी फाइल सिस्टम (जैसे, लिनक्स के तहत mand विकल्प के साथ के रूप में) से समर्थन की आवश्यकता हो सकती हो सकता है। इसलिए, अन्य प्रक्रियाएं उन ताले को नजरअंदाज नहीं कर सकती थीं।

शायद, इसमें PHP 5 में स्ट्रीम उपप्रणाली ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए कुछ locking bookkeeping लागू करती है। उदाहरण के लिए, यह एक ही प्रक्रिया को रोक सकता है (लेकिन दूसरा नहीं) अपने अन्यथा सलाहकार ताले को अनदेखा करने से। व्यवहार might surprise कुछ। फिर भी, इस प्रकार की लॉकिंग असंबंधित प्रक्रियाओं के बीच अनिवार्य नहीं होगी।

पोर्टेबिलिटी के लिए, बस सबसे कमजोर अर्थशास्त्र (ऊपर "हां") मानें और अग्रिम में चुने गए एप्लिकेशन-विशिष्ट लॉकफाइल पर अच्छी तरह से व्यवहार किए गए कोड को झुकाएं।

+0

यदि उस कैश का उपयोग केवल उस विशेष स्क्रिप्ट द्वारा किया जाता है, तो कुछ भी नहीं होगा। अगर कोई फ़ाइल से फटकार करेगा, कहें, खोल - निश्चित, बुरी चीजें घटित होंगी। – favoretti

+0

हां, लेकिन ऐसा नहीं है कि LOCK_EX, उदाहरण के लिए, किसी भी तरह से "कुछ भी वापस नहीं करने के लिए 'फ्रेड' को मजबूर करता है, जैसा कि एक और टिप्पणी ने कहा था। – pilcrow

+0

यदि आप PHP की साइट पर झुंड() पर टिप्पणियां पढ़ते हैं, तो यह वास्तव में करता है कि लॉकिंग सलाहकार है। ऐसा कहा जा रहा है कि, अनिवार्य लॉकिंग, उदाहरण के लिए, लिनक्स केवल फाइल सिस्टम के साथ काम करते समय हासिल किया जा सकता है जो स्पष्ट रूप से इसका समर्थन करता है और इस तरह से आरोहित होता है। – favoretti

2

पहला स्निपेट मूर्ख-प्रमाण है, अगर आपको फ़ाइल पर लॉक नहीं मिल रहा है, तो आप नहीं लिखते हैं। अगर किसी और ने fopen() और flock() के बीच फ़ाइल संपादित की है, तो आपकी फ़ाइल हैंडल नवीनतम अवतार को इंगित करेगी, क्योंकि fopen() 'स्नैपशॉट' के बजाए स्ट्रीम में बांधता है।

दूसरा उदाहरण काम करने की गारंटी नहीं है, क्योंकि flock() का वापसी मूल्य चेक नहीं किया गया है, इसलिए यदि आपने लॉक हासिल नहीं किया है, तो बाद वाला कोड वैसे भी निष्पादित किया जाएगा।

[संपादित करें] हटाया बयान है कि पाठक ताला कोई फर्क नहीं पड़ता, यह वास्तव में, करता है के रूप में नीचे :)

+0

मैं कोड पर अपना प्रश्न बना रहा हूं [** यहां, **] (http://www.jongales.com/blog/2009/02/18/simple-file-based-php-cache-class /) एक MySQL कैशिंग स्थिति में, उस वर्ग में कोड के आधार पर उस मामले में फ़ाइल को एक्सेस करने में सक्षम होने के 20 लोगों को क्या रोकना है? – qwertymk

+0

पढ़ने के लिए - कुछ भी नहीं, जो आप चाहते हैं सबसे अधिक संभावना है, समवर्ती कैश विशेष रूप से उपयोग के बजाय, पढ़ने को पढ़ने के लिए। लिखने के लिए, वास्तव में प्राप्त लॉक अन्य लोगों को कैश में लिखने से रोक देगा। आपको उस कोड के साथ बिल्कुल परेशान कर रहा है? – favoretti

+0

मुझे लगता है कि एक मामूली मुद्दा यह है कि यदि 100,000 लोग सभी एक ही कैश फ़ाइल सेट करने का प्रयास करते हैं और 20,000 को फॉपेन और झुंड के बीच बुलाया जाता है, तो वहां 1 9, 999 अनियंत्रित फ़्राइट्स होंगे, इनमें से कुछ लोगों ने यह देखने के लिए एक जांच की होगी कि क्या कैश ताजा है और यह उस नए फ़ाइलटाइम को याद कर देगा जो इसे प्राप्त होता है। क्या यह भी एक समस्या है? – qwertymk