2011-05-18 5 views
18

php का उपयोग कर फ़ाइल में लिखने के बाद fclose($handle) फ़ंक्शन का उपयोग करके मुझे पूरा करने की आवश्यकता क्यों है? जब प्रोग्राम समाप्त होता है तो प्रोग्राम स्वचालित रूप से ऐसा नहीं करता है?PHP में फ़ाइल में लिखने के बाद मुझे 'fclose` क्यों चाहिए?

+11

हां। PHP स्वचालित रूप से स्क्रिप्ट समाप्ति पर फ़ाइल हैंडल बंद कर देता है। किसी भी प्रकार की सीमाओं में जहां स्क्रिप्ट को फ़ाइल IO के बाद तुरंत समाप्त नहीं किया जाएगा, हालांकि फ़ाइल को बंद करना शायद एक अच्छा विचार है। उदाहरण के लिए, यदि आप एक लाइब्रेरी लिखते हैं, और उस लाइब्रेरी का उपयोग एक सीएलआई स्क्रिप्ट द्वारा किया जाता है जो आपकी लाइब्रेरी को सैकड़ों बार काम करता है, तो प्रत्येक कॉल के बाद फ़ाइल को बेहतर बंद कर दिया गया था। –

+0

@ फ्रैंक, जो एक उत्तर होना चाहिए था ताकि इसे ऊपर उठाया जा सके। :) – sarnold

उत्तर

12

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

+2

क्या यह खुली बात छोड़ने के लिए एक बुरी चीज है? इसे छोड़ने के लिए डाउनसाइड्स क्या हैं? – locoboy

+7

आप अधिक मेमोरी का उपयोग कर रहे हैं, और अन्य प्रक्रियाएं उस फ़ाइल का उपयोग करने में सक्षम नहीं हो सकती हैं। – dtbarne

+0

आह, स्मृति पर अच्छा बिंदु। तो fclose स्मृति जारी करता है ... – locoboy

0

जब प्रोग्राम समाप्त नहीं होता है या लंबा लगता है, तो यह सिस्टम में अधिकतम खुली फ़ाइल हैंडल की ओर गिना जाता है। लेकिन हाँ, PHP आलस्य के लिए अनुमति देता है।

-2

जब कोई फ़ाइल खोली जाती है, तो उस पर एक ताला लगाया जाता है, जिससे अन्य प्रक्रियाओं को इसका उपयोग करने से रोका जा सकता है। fclose() इस लॉक को हटा देता है।

$handle कोई वस्तु नहीं है, केवल एक सूचक है। तो अनलॉक करने के लिए यह कहने वाला कोई विनाशक नहीं है।

+0

मैं यहां आपके सर्वनामों से थोड़ा उलझन में हूं। जब आप कहते हैं कि उस पर एक ताला लगाया गया है, तो क्या आपका मतलब है कि फाइल पर लॉक लगाया गया है? यदि हां, तो फ़ंक्शन का उपयोग करने के साथ लॉक को क्या करना है? ताला क्या करता है? – locoboy

+0

लॉक को फाइल पर रखा गया है। अगर आप फ़ाइल में लिख रहे हैं, और फिर एक और प्रक्रिया आती है और फ़ाइल लिखने की कोशिश करती है - एक्सेस अस्वीकार कर दिया जाएगा क्योंकि एक ही समय में दो अलग-अलग चीजें एक फाइल को नहीं लिख सकती हैं। लॉक दूसरी प्रक्रिया को लिखने में सक्षम होने से रोकता है। – zsalzbank

+0

तो यह एक कारण है कि इससे कोई फर्क नहीं पड़ता? जब तक आपके पॉइंटर्स के लिए अलग-अलग नाम हों, तब तक आपको एक ही प्रोग्राम में एकाधिक फ़ाइलों को लिखने में कोई समस्या नहीं होनी चाहिए। – locoboy

1

हां, PHP सामान्य रूप से बाहर निकलने से पहले फ़ाइल को बंद कर देता है। लेकिन आप हमेशा इसे मैन्युअल रूप से बंद हो जाना चाहिए:

1- यह एक अच्छा प्रोग्रामिंग अभ्यास

2- पीएचपी अप्रत्याशित रूप से बाहर निकल सकते हैं (उदाहरण के लिए, न आया हुआ अपवाद) है। यह फ़ाइल को कतार में कुछ लिखा जा सकता है, या इसमें लॉक के साथ छोड़ सकता है।

+2

मैं अभी भी फ़ाइल हैंडल को साफ करने के लिए एक अपवाद अपवाद की उम्मीद करता हूं। हालांकि, मैंने निश्चित रूप से कुछ बार से अधिक PHP सेगफॉल्ट देखा है, और उस स्थिति में PHP कोई भी प्रकार का क्लीनअप नहीं कर सकता है –

0

न केवल PHP में, प्रत्येक भाषा में हमें काम पूरा होने पर धारा बंद करनी चाहिए। इस तरह हम दूसरों को उस फ़ाइल का उपयोग करने की इजाजत दे रहे हैं। यदि हम इसे बंद नहीं करते हैं, तो प्रोग्राम तब तक इसका उपयोग नहीं कर सकते जब तक कि प्रोग्राम पूरी तरह समाप्त न हो जाए (इस मामले में पृष्ठ)।

4

भी फ़ाइल वर्णनकर्ता खुला छोड़ करने के लिए सुरक्षा के प्रभाव होते हैं: http://cwe.mitre.org/data/definitions/403.html

आपका कार्यक्रम अलग विशेषाधिकार के स्तर के साथ एक कार्यक्रम है, और एक लीक फ़ाइल वर्णनकर्ता पर अमल हो सकता है निजी जानकारी दो अलग-अलग विश्वास की प्रक्रियाओं के बीच सीमा पार करने के लिए अनुमति दे सकता है स्तर:

http://osvdb.org/7559
CVE-2006-5397
CVE-2007-5159
CVE-2008-3914

सुरक्षा बग के साथ मजेदार बात यह है कि जब आप प्रारंभिक फ़ंक्शन लिखते हैं तो यह पूरी तरह से सुरक्षित हो सकता है, लेकिन एक या दो साल बाद निर्दोष दिखने वाले बदलाव के कारण असुरक्षित हो सकता है।

2

आउटपुट बफर में बैठे अनजान डेटा हो सकते हैं जो फ़ाइल बंद होने तक लिखे नहीं जाते हैं। यदि अंतिम लेखन पर कोई त्रुटि उत्पन्न होती है, तो आप यह नहीं बता सकते कि आउटपुट अधूरा है जो बाद में सभी प्रकार की समस्याओं का कारण बन सकता है।

स्पष्ट रूप से बुला fclose()और अपनी वापसी मान लगा कर आप अवसर के लिए है:

  • पुन: प्रयास करें आपरेशन
  • उतारना परिवर्तन
  • वापसी एक कॉलिंग कार्य करने के लिए एक विफलता की स्थिति
  • उपयोगकर्ता को समस्या की रिपोर्ट करें
  • लॉग फ़ाइल में समस्या को दस्तावेज़
  • निष्पादन वातावरण (जैसे कमांड लाइन खोल) के लिए विफलता संकेत लौटाएं जो टूल श्रृंखला में उपयोग किए जाने पर महत्वपूर्ण हो सकता है।

या कोई अन्य तरीका जो आपकी स्थिति को फिट करता है।

यह fclose() manual page के टिप्पणी अनुभाग में उल्लेख है।

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