2014-10-10 5 views
6

मैं एफसीजीआई के माध्यम से PHP चलाता हूं - यह मेरा वेब सर्वर कई PHP प्रक्रियाओं को जन्म देता है और वे पुनर्नवीनीकरण तक 10,000 अनुरोधों के लिए दौड़ते रहते हैं।

मेरा प्रश्न है - अगर मेरे पास मेरी PHP स्क्रिप्ट के शीर्ष पर $mysqli->connect है, तो क्या मुझे $mysqli->close पर कॉल करने की आवश्यकता है जब मैं स्क्रिप्ट चलाने के बारे में हूं?

चूंकि PHP प्रक्रियाएं लंबे समय तक खुली हैं, इसलिए मैं प्रत्येक $mysqli->connect छवि को रिसाव कर दूंगा, क्योंकि प्रक्रिया चलती रहती है और कोई भी कनेक्शन बंद नहीं करता है।

क्या मैं अपनी सोच में सही हूं या नहीं? क्या मुझे $mysqli->close पर कॉल करना चाहिए?

उत्तर

7

जब PHP बाहर निकलता है तो यह डेटाबेस कनेक्शन को गहराई से बंद कर देता है।

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

इसे किसी स्क्रिप्ट के अंत में रखना मतलब अनावश्यकता, कोई प्रदर्शन या स्मृति लाभ नहीं है।

+0

हाँ, लेकिन PHP मेरे मामले में बाहर नहीं निकलता है। वेब सर्वर उन्हें उड़ाता है और फिर प्रक्रियाओं को बाहर निकलने के बिना उन्हें चीजों को चलाने के लिए धक्का देता रहता है। प्रक्रिया 10,000 अनुरोधों के लिए खुली रहती है। (कम से कम मैं एफसीजीआई द्वारा समझता हूं।) – bodacydo

+0

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

3

में थोड़ा और अधिक विस्तार में, विशेष रूप से FastCGI के बारे में:

FastCGI पीएचपी प्रसंस्करण अनुरोधों के बीच चलता रहे। FastCGI प्रत्येक सर्वर अनुरोध के लिए एक अलग PHP प्रक्रिया शुरू करने के बजाय PHP स्क्रिप्ट को स्मृति में रखने के लिए अपने सर्वर की उपलब्ध रैम का लाभ उठाकर CPU उपयोग को कम करने में अच्छा है।

2

मैंने कभी भी मेरे डेटाबेस कनेक्शन को बंद करने के लिए एफसीजीआई पर भरोसा नहीं किया है। कई साल पहले एक शुरुआती पुस्तक में मैंने सीखा एक आदत हमेशा मेरे डेटाबेस कनेक्शन को स्पष्ट रूप से बंद करना है।

संभव स्मृति और कनेक्शन रिसाव के सोलह कीस्ट्रोक टाइप नहीं कर रहा है? जहां तक ​​मैं इसके सस्ते बीमा से चिंतित हूं।

+0

क्यों एक डाउनवोट? मैं बीमा बेच रहा हूँ, है ना? –

3

फास्टसीजीआई एक मास्टर प्रक्रिया शुरू करेगा और उस मास्टर प्रक्रिया के कई फोर्कों को परिभाषित कर देगा जैसा कि आपने परिभाषित किया है और हां उन फोर्कड प्रक्रियाओं में लंबे समय तक जीवन हो सकता है। इसका अर्थ यह है कि प्रक्रिया को प्रत्येक स्क्रिप्ट को निष्पादित करने की आवश्यकता होने पर पूर्ण PHP प्रक्रिया को शुरू करने की आवश्यकता नहीं होती है। लेकिन ऐसा नहीं लगता कि आपको लगता है कि आपकी स्क्रिप्ट अब हर समय चल रही हैं। हर बार एक स्क्रिप्ट को निष्पादित करने के लिए स्टार्ट-अप और शट डाउन चरण होता है। इस बिंदु पर वैश्विक चर जैसी चीजें (उदा। $_POST और $_GET) आबादी वाले हैं आदि। प्रत्येक बार जब आपकी प्रक्रिया register_shutdown_function() के माध्यम से बंद हो जाती है तो आप कार्य निष्पादित कर सकते हैं।

यदि आप लगातार डेटाबेस कनेक्शन का उपयोग नहीं कर रहे हैं और डेटाबेस कनेक्शन बंद नहीं कर रहे हैं, तो कुछ भी बुरा नहीं होगा। कॉलिन शॉन ने समझाया, अंततः PHP बंद होने के दौरान उन्हें बंद कर देगा।

फिर भी, मैं अत्यधिक आपको अपने कनेक्शन बंद करने के लिए प्रोत्साहित करता हूं क्योंकि एक सही ढंग से तैयार किया गया प्रोग्राम जानता है कि किसी ऑब्जेक्ट का जीवनकाल खत्म होने पर और स्वयं को साफ़ कर देता है। यह आपको वास्तव में मिली-नैनोसेकंड दे सकता है जिसे आपको समय पर कुछ देने की ज़रूरत है।

सीधे शब्दों में हमेशा आत्म निहित वस्तुओं है कि यह भी सफाई कर रहे हैं के बाद वे जो कुछ भी उन्होंने किया के साथ समाप्त कर पैदा करते हैं।

2

यदि आप लंबे समय तक फास्टसीजीआई प्रक्रियाओं को चला रहे हैं, उदाहरण के माध्यम से php-fpm, आप प्रत्येक प्रक्रिया के अंदर अपने डेटाबेस कनेक्शन का पुन: उपयोग करके और एक खोलने की लागत से परहेज करके प्रदर्शन प्राप्त कर सकते हैं।

चूंकि आप अपने कोड में किसी बिंदु पर कनेक्शन खोलने की संभावना रखते हैं, इसलिए आपको पढ़ना चाहिए कि mysqli एक सतत कनेक्शन कैसे खोलें और उसी प्रक्रिया द्वारा प्रबंधित किए गए अनुरोधों पर आपको वापस कर दें।

http://php.net/manual/en/mysqli.quickstart.connections.php

http://php.net/manual/en/mysqli.persistconns.php

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

1

आप अपने सोचने के तरीके में सही हैं। मेमोरी/डेटा लीक और भ्रष्टाचार को रोकने के लिए कनेक्शन बंद करना अभी भी महत्वपूर्ण है।

आप कनेक्शन के बंद होने के लिए रोकने के लिए प्रत्येक चक्र को पुनर्नवीनीकरण की मात्रा को भी कम कर सकते हैं।

उदाहरण के लिए: प्रत्येक 2500 स्क्रिप्ट चलाता है, बंद और बंद और कनेक्शन फिर से खोलता है।

भी अनुशंसित: बार-बार डेटा का बैक अप लें।

आशा है कि मैंने मदद की। प्रेत

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