1

こちらで質問するのは初めてです。私が抱えている問題の助けを求めて、Google、stackoverflowなどを探しました。現在、Apache 2.2.21 (CentOS) で PHP 5.3.10 & MySQL 5.0.95 を使用しています。

私たちは、古い mysql ライブラリから新しいコードの mysqli への切り替えを開始する過程にあり、私がその責任を担っています。私はもう試した

  • 作業が完了したら、データベースへの接続を明示的に閉じるようにします
  • 使い終わったら結果セットを解放する
  • 接続制限を 150 から 250 に引き上げ

特定のものを検証するために古いスタイルの mysql_pconnect() を使用する (セッション チェックなどに関係する) ファイルが含まれています。これらは、ほぼすべてのコードに含まれています。

コードのようなもの:

$mysqli =  new mysqli('p:'.DBHOST, DBUSER, DBPASS, $_SESSION['dbname']);
if ($mysqli->connect_error) {
    throw new Exception($mysqli->connect_error,  $mysqli->connect_errno);
    exit;
}
// do my stuff here, a bunch of SQL queries like:
$sql = 'SELECT * FROM MyTable';
$result = $mysqli->query($sql);
if (!$result) {
    throw new SQLException($sql, $mysqli);
    exit;  
    // SQLException is an extension to mysqli_sql_exception that adds the 
    // query into the messaging internally
}
while ($result && $row = $result->fetch_assoc()) {
// do stuff here, like show it on screen, etc., all works normally
}
$result->free(); // free up the result
$mysqli->close(); // close the connection to the database

結果を解放して接続を閉じることは、「接続が多すぎます」というエラーが発生した後に行ったことです。それを行う前は、プログラムを実行するたびに 3 ~ 4 個の新しいデータベース接続を取得していました。(SHOW PROCESSLIST を使用してバックエンドで表示)

問題はいくらか軽減されます (毎回 3 つの新しい接続ではなく、0 から 3 つの新しい接続が追加されます)。

私の読書のいくつかは、これがApacheスレッド化と関係がある可能性があることを示唆しています+現在のスレッドに既存のアイドル状態の接続がない場合に追加された新しい永続的な接続。これですか?永続的な接続は mysqli で十分にサポートされていませんか? (執着をあきらめるべきか?)

ご提案いただきありがとうございます。

4

1 に答える 1

1

私は mysqli の永続的な接続の経験がありませんが、あなたの質問と期待のいくつかは私には奇妙に思えます。

mysqli は p: connect オプションを使用して複数の新しいプロセスを開きます

はい、それが永続的な接続の目的です

作業が完了したら、データベースへの接続を明示的に閉じるようにします

それができないので、明示的に閉じたことを確認することはできません。繰り返しますが、永続的な接続の唯一のポイントは、開いたままにすることです

プログラムを実行するたびに、3 ~ 4 個の新しいデータベース接続を取得します。

したがって、1 つだけ開いていることを確認する必要があります。

  • スクリプトから少なくとも 2 つの接続があります - 1 つは古いスタイルで、いくつかは mysqli からですか?
  • インスタンス化されている mysqli オブジェクトの数は?
  • 1 つの HTTP リクエストを処理するために実行される PHP スクリプトの数は? 本気ですか?

結局のところ、そんなに気になるのなら、なぜ永続的な接続を使用しているのですか? それから何か本当の(想像上のものではない)利益はありますか?結局のところ、バージョンが 5.3 の場合、わざわざ mysql から書き直す必要があるのでしょうか?

于 2013-03-14T04:20:27.067 に答える