2014-06-17 9 views
7

मेरे पास एक PHP सर्वर अनुप्रयोग कटाई ट्वीट्स है और इस प्रकार लगातार चल रहा है। यह एप्लिकेशन कुछ दिनों के बाद विफल होने लगता है। एक MySQL चयन कथन के लिए परिणाम वापस करने से इनकार कर दिया। मुझे पता चला कि यह (PHP चेतावनी) बह निकला php संसाधन आईडी की वजह से है:PHP संसाधन आईडी ओवरफ़्लो त्रुटि

-2147483648 एक वैध MySQL परिणाम संसाधन

इसका मतलब यह है आवेदन संभव आईडी से बाहर चल रहा है एक संसाधन के लिए आवंटित करने के लिए नहीं है परिवर्तनीय (पूछे जाने वाले प्रश्नों की बहुत अधिक मात्रा के कारण)। मुझे लगा कि इस प्रश्न का उत्तर mysql_free_result प्रत्येक mysql चुनिंदा कथन के नीचे उपयोग करना था ताकि प्रत्येक संसाधन अंततः मुक्त हो। हालांकि यह मेरी समस्या का समाधान नहीं किया।

कुछ मंचों पर मैंने पढ़ा कि PHP पुन: उपयोग संसाधन संसाधनों को पुन: उपयोग करने में असमर्थ है। इसका मतलब यह होगा कि MySQL डेटाबेस से पुन: कनेक्ट करने का एकमात्र व्यावहारिक समाधान है?

मेरी PHP संस्करण पर कुछ जानकारी:

पीएचपी 5.5.10-1 + deb.sury.org ~ सटीक + 1 (CLI) (बनाया: Mar 27 2014 16:18:01) कॉपीराइट (ग) 1997-2014 PHP समूह जेंड इंजन v2.5.0, कॉपीराइट (c) 1998-2014 Zend टेक्नोलॉजीज Zend OPcache v7.0.3, कॉपीराइट (c) 1999-2014, Zend टेक्नोलॉजीज द्वारा साथ

करता है किसी को इस मुद्दे के साथ अनुभव है? क्या एक और समाधान नियमित रूप से mysqli एक्सटेंशन का उपयोग करना चाहिए?

धन्यवाद!

+0

आपने कहां पढ़ा कि वे पुन: उपयोग के लिए कभी उपलब्ध नहीं हैं? आपका PHP संस्करण क्या है? [वह व्यवहार दस्तावेज प्रतीत नहीं होता है] (http://www.php.net/manual/en/language.types.resource.php) –

+5

क्या आप [डीबी लगातार कनेक्शन का उपयोग कर रहे हैं] (http: // www .php.net/मैनुअल/en/features.persistent-connections.php)? (ध्यान दें, आपको पीडीओ या MySQLi का उपयोग करना चाहिए, क्योंकि पुराने 'ext/mysql' को बहिष्कृत किया गया है) –

+3

यह एक ज्ञात PHP बग है जो वर्षों से खुला है। देखें कि इनमें से कोई भी लिंक आपकी मदद करता है या नहीं।मैं किसी भी लेख का लेखक नहीं हूं और मुझे किसी भी साइट के साथ कोई संबद्धता नहीं है। http://www.php.net//manual/en/mysqli.persistconns.php http://brandonwamboldt.ca/tag/overflow/ –

उत्तर

1

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

हालांकि, यदि आप सुनिश्चित हैं कि आपका ऐप संसाधन आईडी को समाप्त करता है, तो अनसेट() या mysql_free_result() का उपयोग करके आप संसाधनों को मुक्त कर सकते हैं, तो मुक्त आईडी फिर से उपलब्ध है और PHP इन संसाधनों का पुन: उपयोग कर सकता है। 64 बिट सिस्टम में, यह संभावना नहीं है कि आप संसाधन आईडी से बाहर हो सकते हैं।

प्रोग्राम को अनुकूलित करने के लिए बेहतर होगा कि संसाधनों को बर्बाद न करने और फिर रीसेट करने के बजाय संसाधनों को बर्बाद न करें। इतनी जल्दी आप प्रचुर मात्रा में संसाधनों से बाहर निकल सकते हैं।

क्या हुआ जब आपने mysql_free_result() कहा था? बीटीडब्ल्यू, यदि आप mysqli का उपयोग करते हैं, तो आपको mysql_free_result() के बजाय mysqli_result :: free का उपयोग करना चाहिए।

+0

मुझे पूरा यकीन है कि मैं मुक्त संसाधन वस्तुओं का पुन: उपयोग नहीं कर रहा हूं। इससे पहले कि मैंने किसी भी mysql_free_result स्टेटमेंट का उपयोग किया था, समस्या पहले से ही हो रही थी। बाद के मामले में त्रुटि तुरंत उत्पन्न होगी और न केवल तीन दिनों के बाद। प्रोग्राम को अनुकूलित करने के साथ आपका क्या मतलब है? मैं वही (मुक्त) संसाधन वस्तुओं का पुन: उपयोग कैसे कर सकता हूं? "हालांकि, अगर आप सुनिश्चित हैं कि आपका ऐप संसाधन आईडी के बाहर चला जाता है, तो unset() या mysql_free_result() का उपयोग करके आप संसाधनों को मुक्त कर सकते हैं" यह वास्तव में मेरा बिंदु है क्योंकि यह काम करने में विफल रहता है। ऐसा लगता है कि PHP प्रत्येक नए संसाधन ऑब्जेक्ट के लिए संसाधन आईडी में केवल एक को जोड़ता है। – Baptist

+0

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

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