14

PHPでmysqliクラスを使用するのに問題があり、どこにも答えを見つけることができませんでした。

私のスクリプトでは、クラスはその関数全体で使用するmysqli接続を作成します。その後、このスクリプトは分岐します。接続は子によっても使用されますが、子が死んだときに親で接続が閉じられる(MYSQLサーバーがなくなった)という問題が発生しています。

mysqliに切り替える前に(mysqlを使用していた)、親プロセスでクエリを実行する前に、mysql_pingを呼び出してdb接続が存在することを確認しました。Mysqliにも同様のping機能がありますが、接続が失われた場合、実際には再接続されません。mysqli.reconnect = ONグローバル設定をうまく使用してみました(php.iniとini_setを使用)。

php mysql_connect関数を使用すると、既存の接続を取得できるため、mysqliの代わりにmysqlを使用している場合は、プロセスが分岐した直後に子で接続を再利用できます。しかし、mysqliにはそのような機能がないようです...

私ができた唯一のことは、mysqli-> ping()を呼び出すことでした。それがfalseを返した場合は、親のデータベースに再接続します。これはひどく非効率的であり、mysqlに戻す必要があるmysqliで正しく行う方法(および手動で再接続する必要がない)を理解したいと思います。

助言がありますか?

4

6 に答える 6

16

のドキュメントにmysqli_ping()よると、グローバルオプションmysqli.reconnectを(php.iniで)1に設定mysqli_ping()すると、接続が切断されたことが検出されたときに再接続されます。

更新:2009年にこの質問に回答して以来、PHPは、ほとんどの場合、libmysqlの代わりにデフォルトでmysqlndドライバーを使用するようになりました。以下のコメントで述べられているように、mysqlndはこの関数をサポートしておらず、PHP開発者は、 https ://bugs.php.net/bug.php?id = 52561の「修正しない」という回答に従って、意図的にこれを行っています。mysqli_ping()

そのため、PHPでの自動再接続の解決策はもうないようです。

于 2009-09-24T07:18:20.567 に答える
0

pingの代わりに少し違うことを試すことができます..「selectnow()」のような非常に単純な低強度のクエリを送信して、より良い結果が得られるかどうかを確認してください。

于 2009-09-24T01:45:29.427 に答える
0

持続的接続を使用できませんか?また、それはfork()に本当に必要ですか?

于 2009-09-24T07:39:22.753 に答える
0
function IsConnected() {
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) {
        return true; // still have connect
    }
    $this->_connectionID = false;
    return false; // lose connection
}
于 2013-03-19T04:26:56.747 に答える
-1

http://www.php.net/manual/en/mysqli.real-connect.phpを使用します...phpを再インストールし、php.iniの設定を確認します

于 2009-09-23T23:18:01.370 に答える
-2

php.iniではなくmysqlconfigであるmy.cngでmysqli.reconnectを設定する必要があると思います。ini_setを介して再接続を変更することはできませんでしたが、システム管理者はmy.cnfで設定しました。

だから、他の人がphp.ini内でそれをやったと少し混乱しました...。

于 2011-11-29T13:33:36.453 に答える