जब कोई प्रक्रिया पूरी हो जाती है (या तो क्योंकि यह बाहर निकल जाती है या इसे सिग्नल का उपयोग करके समाप्त कर दिया जाता है) तो सभी फाइलें और कनेक्शन जो खुले रहते हैं, ऑपरेटिंग सिस्टम द्वारा स्वचालित रूप से बंद हो जाते हैं। कनेक्शन बंद करने के लिए MySQL प्रोटोकॉल का उपयोग करके इसे साफ नहीं किया गया है (मान लीजिए कि एक है)। यह टीसीपी/आईपी स्तर पर सरल है और दूसरी तरफ सर्वर को पता चलता है कि यह एक बंद दरवाजे से बात कर रहा है। यह हमेशा तुरंत नहीं होता है, कभी-कभी इसमें कुछ समय लगता है जब तक कि सर्वर नोटिस नहीं करता कि चर्चा भागीदार चला गया है। जब ऐसा होता है, तो यह कनेक्शन को गिरा हुआ मानता है और अपनी तरफ की चीजों को साफ करता है।
नहीं fork()
. का उपयोग करने से पहले मूल प्रक्रिया में MySQL कनेक्शन खोलें . fork()
कनेक्शन के स्थानीय पक्ष को प्रबंधित करने के लिए उपयोग की जाने वाली डेटा संरचनाओं को डुप्लिकेट करता है और परिणाम अप्रत्याशित होते हैं। इससे भी अधिक, जब बच्चा पूरा करता है (चाहे कैसे भी), यह कनेक्शन बंद कर देता है (या ओएस इसे छोड़ देता है), MySQL सर्वर भी अपना अंत बंद कर देता है और मूल प्रक्रिया को पता चलता है कि यह किसी से बात नहीं कर रहा है।
fork()
. का उपयोग करने से पहले मूल प्रक्रिया में MySQL कनेक्शन को बंद कर दें फिर माता-पिता और बच्चे की प्रक्रिया में आवश्यकतानुसार अलग-अलग कनेक्शन खोलें।
साथ ही, माता-पिता की प्रक्रिया में सर्वर के साथ किसी भी MySQL संचार को इस बीच लपेटें:
pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));
और
pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));
अन्यथा, जब कोई चाइल्ड प्रोसेस पूरी हो जाती है, तो पैरेंट प्रोसेस को SIGCHLD
. द्वारा सूचित किया जाता है संकेत। एक प्राप्त संकेत इसे सोने से फिर से शुरू करता है (यदि यह एक sleep()
. में रोका गया हो तो) सिग्नल आने पर कॉल करें)। MySQL लाइब्रेरी sleep()
. का उपयोग करती है सर्वर के साथ संचार के लिए MySQL प्रोटोकॉल के भाग के रूप में। अगर ऐसा sleep()
(एक प्राप्त संकेत के कारण) जबरन वापस लौटना चाहिए (एक प्राप्त संकेत के कारण), MySQL पुस्तकालय भ्रमित हो जाता है और यह अजीब त्रुटियों की रिपोर्ट करना समाप्त कर देता है (जैसे "MySQL सर्वर चला गया") जो वास्तव में सही नहीं हैं।
इस उत्तर पर एक नज़र डालें विस्तृत विवरण के लिए।