2009-09-23 38 views
11

PHPでmysqliクラスを使用する際に問題が発生しており、どこでも答えを見つけることができませんでした。PHP mysqli再接続の問題

私のスクリプトでは、クラスはその機能を通して使用するmysqli接続を作成します。その後、このスクリプトはフォークします。接続は子供達によっても使用されますが、子どもが死ぬと親の中で接続が切断される問題(MYSQL Server Has Gone Away)が発生しています。

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

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

私ができることは、mysqli-> ping()を呼び出すことでした。それがfalseを返した場合は、親のデータベースに再接続してください。これはひどく非効率で、mysqli(そして手動で再接続する必要はありません)を使ってmysqlに正しく変更する方法を理解しています。

何か提案がありますか?

答えて

13

ドキュメントは、あなたが(あなたのphp.iniの)1にグローバルオプションmysqli.reconnectを設定した場合、それは、接続が解消された検出したときに、その後mysqli_ping()が再接続されますと言っています。

+3

それはうまくいった。私はあなたがこの変数を変更するためにini_setを使用することができなかったことに気づいていませんでした。私は天才で、前にphp.iniに行を追加しました。ファイル。しかし、それを削除してmysqli.reconnectを使ってmysqli-> ping()をmysql_pingと同じように動作させました。助けてくれてありがとう! –

-1

使用http://www.php.net/manual/en/mysqli.real-connect.php ... PHPを再インストールして、php.iniの設定を確認してください

+0

をPHPはやり過ぎだろう再インストール混乱して少し。ウェブ上のデフォルトのphp.iniを探し、php.iniの変更量を確認してください。 – Phalgun

0

uが...代わりのpingの..少し違うものを試してみてください(「今のような選択は本当に単純な低強度のクエリを送信しようとすることができます) "とあなたが良い結果を得るかどうかを確認してください。 mysqli_ping()ため

+0

これは役に立つかもしれない理由... mysqlは、接続とホギングのリソースを持っている人の代わりに、アクティブユーザとしてuを見ています。my.ini/my.cnfにタイムアウトの設定がいくつかあると思いますあなたがそれにアクセスしているなら、それを調べることもできます。 –

0

永続的接続を使用できませんか?また、fork()するのに本当に必要ですか?

-2

mysqli.reconnectをmy.cngに設定する必要があると思います。これはphp.iniではなくmysql設定で、ini_set経由で再接続を変更することはできませんでした。 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 
}