2009-09-23 18 views
11

मुझे PHP में mysqli क्लास का उपयोग करने में समस्या हो रही है और मैं कहीं भी जवाब नहीं ढूंढ पा रहा हूं।PHP mysqli समस्या को फिर से कनेक्ट करें

मेरी स्क्रिप्ट में एक वर्ग एक mysqli कनेक्शन बनाता है जो इसे अपने पूरे कार्यों में उपयोग करता है। इसके बाद, इस स्क्रिप्ट कांटेदार। कनेक्शन बच्चों द्वारा भी उपयोग किया जाता है, लेकिन जब मैं मर जाता हूं तो माता-पिता में कनेक्शन बंद होने की समस्या में समस्या हो रही है (MYSQL सर्वर दूर चला गया है)।

इससे पहले कि मैं mysqli करने के लिए (बस mysql उपयोग कर रहा था) मैं बस mysql_ping कहा जाता है विश्वास दिलाता हूं कि डाटाबेस कनेक्शन माता पिता की प्रक्रिया में क्वेरी प्रदर्शन से पहले वहाँ था बंद। माईस्क्ली का एक समान पिंग फ़ंक्शन है लेकिन कनेक्शन समाप्त होने पर यह वास्तव में फिर से कनेक्ट नहीं होता है। मैंने mysqli.reconnect = किसी भी किस्मत के साथ वैश्विक सेटिंग पर (php.ini और ini_set का उपयोग करके) का उपयोग करने का प्रयास किया।

php mysql_connect फ़ंक्शन आपको पहले से मौजूद कनेक्शन को पकड़ने की अनुमति देता है, इसलिए यदि मैं mysqli के बजाय mysql का उपयोग कर रहा था, तो मैं प्रक्रिया के फोर्क के ठीक बाद बच्चे में कनेक्शन का पुन: उपयोग कर सकता था। लेकिन mysqli में ऐसी कोई कार्यक्षमता प्रतीत नहीं होती है ...

केवल एक चीज जो मैं करने में सक्षम था, mysqli-> पिंग() को कॉल किया गया था और यदि वह गलत लौटा तो माता-पिता में डेटाबेस से पुनः कनेक्ट करें। यह बहुत अक्षम है, और मैं यह समझता हूं कि mysqli (और मैन्युअल रीकनेक्ट्स के लिए कोई ज़रूरत नहीं है) के साथ इसे सही तरीके से कैसे करना है।

कोई सुझाव?

उत्तर

13

mysqli_ping() के लिए दस्तावेज़ का कहना है कि आप वैश्विक विकल्प mysqli.reconnect 1 करने के लिए निर्धारित करते हैं (अपने php.ini में) तो mysqli_ping() फिर से कनेक्ट होगा जब यह पता लगाता है कनेक्शन दूर चला गया है।

+3

यह काम किया। मुझे एहसास नहीं हुआ कि आप इस चर को संशोधित करने के लिए ini_set का उपयोग नहीं कर सकते हैं, और मैं जो प्रतिभाशाली हूं, मैंने पहले php.ini को लाइन जोड़ा, यह नहीं जानते कि पहले से ही mysli.reconnect = ऑफ लाइन नीचे है फ़ाइल। लेकिन उस को हटाकर और सिर्फ mysqli.reconnect का उपयोग करके काम किया और mysqli-> पिंग() को mysql_ping की तरह ही किया। सहायता के लिए धन्यवाद! –

-1

उपयोग http://www.php.net/manual/en/mysqli.real-connect.php ... php पुनः स्थापित और अपने php.ini सेटिंग्स की जाँच

+0

को पुनर्स्थापित करना php एक overkill होगा। वेब में एक डिफ़ॉल्ट php.ini खोजें और जांचें कि आपका php.ini कितना बदल गया है। – Phalgun

0

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

+0

कारण जो मदद कर सकता है ... mysql आपको किसी ऐसे व्यक्ति के बजाय सक्रिय उपयोगकर्ता के रूप में देखता है जो केवल कनेक्शन धारण कर रहा है और संसाधनों को हॉग कर रहा है .. मुझे विश्वास है कि my.ini/my.cnf में कुछ टाइमआउट सेटिंग्स हैं जो उस व्यवहार को प्रभावित करती हैं .. अगर आपके पास उस तक पहुंच है तो आप इसे भी देख सकते हैं। –

0

क्या आप लगातार कनेक्शन का उपयोग नहीं कर सकते? इसके अलावा, क्या यह वास्तव में कांटा() के लिए जरूरी है?

-2

मुझे लगता है कि आपको my.cq में mysqli.reconnect सेट करने की आवश्यकता है, जो php.ini की बजाय mysql config है, मैं ini_set के माध्यम से पुन: कनेक्ट करने का प्रबंधन नहीं कर सका, लेकिन मेरे sys व्यवस्थापक ने इसे मेरे अंदर किया। cnf।

तो, बालक भ्रमित है कि दूसरों php.ini के भीतर किया है ....

+0

सच नहीं है। 'my.cnf' केवल MySQL सर्वर से संबंधित है, इसलिए आमतौर पर PHP क्लाइंट पर कोई प्रभाव नहीं पड़ेगा, और 'mysqli' केवल PHP के भीतर मौजूद है। [mysqli.reconnect] (http://www.php.net/manual/ en/mysqli.configuration.php # ini.mysqli.reconnect) * एक PHP कॉन्फ़िगरेशन सेटिंग है। – Synchro

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
} 
संबंधित मुद्दे