こちらで質問するのは初めてです。私が抱えている問題の助けを求めて、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 で十分にサポートされていませんか? (執着をあきらめるべきか?)
ご提案いただきありがとうございます。