سؤال

أواجه مشكلة في استخدام فئة Mysqli في PHP ولم أتمكن من العثور على الإجابة في أي مكان.

في البرنامج النصي، يقوم فئة بإنشاء اتصال MySQLI الذي يستخدمه في جميع أنحاء العالم. بعد ذلك، شوك النصي هذا. يستخدم الأطفال من قبل الأطفال أيضا، لكنني في مشكلة الاتصال التي يتم إغلاقها (قد ذهب خادم MySQL) في الوالد عندما يموت الأطفال.

قبل أن تتحول إلى MySqli (كان مجرد استخدام MySQL)، فإنني أسمى ببساطة MySQL_PING لضمان أن اتصال DB كان هناك قبل إجراء الاستعلام في العملية الأصلية. MySQLI لديه وظيفة بينغ مماثلة ولكنها لا توصل في الواقع إذا ذهب الاتصال. حاولت استخدام mysqli.reconnect = على الإعداد العالمي بدون حظ (باستخدام php.ini و ini_set).

تتيح لك وظيفة PHP MySQL_CONNECT الاستيلاء على اتصال موجود بالفعل، لذلك إذا كنت أستخدم MySQL بدلا من MySQLI، فيمكنني ببساطة إعادة استخدام الاتصال في الطفل مباشرة بعد التشويش على العملية. لكن mysqli لا يبدو أن لديك أي وظيفة مثل هذه الوظائف ...

الشيء الوحيد الذي كنت قادرا على فعله هو استدعاء MySqli-> Ping () وإذا عاد ذلك خطأ FALSE ثم إعادة الاتصال بقاعدة البيانات في الأصل. هذا غير فعال بشكل رهيب، وأود أن أطرح الكثير من كيفية القيام بذلك بشكل صحيح مع MySQLI (وليس هناك حاجة لإعادة الاتصال اليدوي) التي يجب تغييرها إلى MySQL ..

أي اقتراحات؟

هل كانت مفيدة؟

المحلول

الوثيقة ل mysqli_ping() يقول أنه إذا قمت بتعيين الخيار العالمي mysqli.reconnect. إلى 1 (في php.ini الخاص بك) ثم mysqli_ping() سيتم إعادة الاتصال عند اكتشاف الاتصال قد ذهب بعيدا.

تحديث: منذ الإجابة على هذا السؤال في عام 2009، انتقلت PHP في الغالب لاستخدام mysqlnd. سائق افتراضيا بدلا من libmysql.. وبعد كما ذكر في التعليق أدناه، mysqlnd. لا يدعم mysqli_ping() وظيفة، وكان مطورو PHP هذا عمدا، وفقا لإجابة "لن إصلاح" في https://bugs.php.net/bug.php؟id=52561.

لذلك يبدو أنه لا يوجد حل لإعادة الاتصال التلقائي في PHP بعد الآن.

نصائح أخرى

يمكنك تجربة شيء مختلف بعض الشيء .. بدلا من Ping .. حاول إرسال استعلام قليل حقا منخفض الكثافة مثل "حدد الآن ()" ومعرفة ما إذا كنت تحصل على أي نتائج أفضل.

لا يمكنك استخدام الاتصالات المستمرة؟ أيضا، هل هذا ضروري حقا للشوكة ()؟

function IsConnected() {
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) {
        return true; // still have connect
    }
    $this->_connectionID = false;
    return false; // lose connection
}

يستخدم http://www.php.net/manual/en/mysqli.real-connect.php. ... أعد تثبيت PHP وتحقق من إعدادات PHP.INI الخاصة بك

أعتقد أنك بحاجة إلى تعيين mysqli.reconnect في my.cng، وهو التكوين MySQL، بدلا من PHP.INI، لم أستطع تغيير إعادة الاتصال عبر INI_SET، لكن مسؤول SYS الخاص بي فعل ذلك في my.cnf.

لذلك، حيرة صبي أن الآخرين قد فعلوا ذلك داخل php.ini ....

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top