PHP mysqliの再接続の問題
質問
私はPHPにmysqliのクラスを使用してトラブルを抱えていると私はどこにでも答えを見つけることができませんでした。
私のスクリプトでクラスが、それはそれの機能全体で使用していることをmysqliの接続を作成します。その後、このスクリプトフォーク。子供が死ぬとき、親に(MySQLサーバが解消された)閉鎖されている接続が同様に子供たちによって使用されているが、私は、接続の問題に実行しています。
私は(ちょうどMySQLを使用していた)mysqliのように切り換え前に、私は単純にDB接続は、親プロセスでクエリを実行する前にあったことを確実にするために、mysql_pingと呼ばれます。 mysqliのは、類似したピング機能を持っていますが、接続がなくなっている場合、それは実際には再接続しません。ノー運(php.iniのとini_setを使用して)グローバル設定に= mysqli.reconnectを使用してみました。
PHPのにmysql_connect関数を使用すると、既存の接続をつかむことができますので、私は代わりにmysqliののMySQLを使用していた場合、私は単にプロセスをフォークした直後に子で接続を再利用することができます。しかしmysqliのはどのような機能を持っていないようです...
私が行うことができた唯一のことは、コールmysqli-> pingを(あった)、それがfalseを返した場合、親でデータベースに再接続します。これはひどく非効率的である、と私はむしろmysqliの(と手動再接続は必要ありません)で正しくそれを行う方法を見つけ出すだろう背中のmysql ..
に変更したこと任意の提案ですか?
解決
mysqli_ping()
のためのドキュメントは、あなたが(あなたのphp.iniで)1にグローバルオプションをのmysqli.reconnect の設定されている場合、それは、接続が解消された検出したときに、その後mysqli_ping()
が再接続されますと言っています。
アップデート:私は2009年にこの質問に答えているので、PHPは、主にのmysqlnd のデフォルトでは、ドライバの代わりに、のlibmysql のを使用することで移動しています。以下のコメントで述べたように、はmysqlnd はmysqli_ping()
機能をサポートしていない、とPHPの開発者は<のhref = "httpsの中に彼らの「修正されません」の回答によると、意図的にこれをしなかった:// bugs.php.net/bug.php?id=52561" のrel = "nofollowをさnoreferrer"> https://bugs.php.net/bug.php?id=52561 の
だから、もうPHPで自動再接続のための解決策はないようである。
他のヒント
U「)は、(現在選択して」のような、本当にシンプルな低強度のクエリを送信しよう...代わりの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/を使用しますエン/ mysqli.real-connect.php に... PHPを再インストールして、php.iniの設定を確認してください。
私はあなたがMySQLの設定ではなく、php.iniのある、my.cngにmysqli.reconnectを設定する必要があると思う、私はini_setを経由して再接続に変更するために管理することができませんでしたが、私のsysの管理者は、my.cnfの中でそれをやりましたます。
だから、少し混乱した他はphp.iniの中にそれを行っていることを....