0

認証用のアプリケーションの 1 つで phpgacl ライブラリを使用しています。このライブラリは、mysql_pconnect を使用してデータベースに接続しています。問題は、接続が再利用されず、接続が多すぎるというエラーでアプリケーション全体がクラッシュする場合があることです。同時ユーザーが多すぎるわけではないため、mysql の最大接続数を増やしても問題は永久に解決されません。問題を単純化するために簡単なテストを行いました。簡単なphpスクリプトを書きました/var/www/a.php

<?
mysql_pconnect('localhost', 'root', 'root');
?>

localhost/a.php初めてヒットすると、mysql プロセスリストにデータベースへの接続が 1 つ表示されます。リンクを 2 回目にクリックすると、その接続が再利用されることを期待します。しかし、そうではありません。新しい接続が作成され、スリープ状態の 2 つの接続が表示されます。リンクを踏むたびにカウントが増えます。

Apacheを再起動すると、これらすべての接続が閉じられます。

php mysql_pconnect がどのように機能し、以前に作成された mysql 接続をどのように使用するかを知りたいです。そして、上記の例でこれが起こらないのはなぜですか?

ここのコメントの1つは次のとおりです。

You are probably using a multi-process web server such as Apache. Since database connections cannot be shared among different processes a new one is created if the request happen to come to a different web server child process.

これは、Apache で mysql_pconnect を使用することは推奨されないということですか?

4

1 に答える 1

0

すべての DB 接続は、php プロセスの終了とともに終了します。そのため、永続的な接続は他の Web スレッドと共有されないことが予想されます。 mysql_pconnect異なるクラス間でアプリケーション実行時のみDB接続を共有できます。つまり、問題の解決策は次のとおりです。

  1. MySQL 構成で DB 接続のタイムアウトを減らす
  2. アプリで DB 接続を閉じる
  3. DBクエリ用の独自のデーモンを作成します(ただし、非常に複雑です)
于 2013-08-24T19:52:59.123 に答える