昨日はすべて正常に機能していました。PHP アプリケーションへのリンクを顧客に送信します。数時間後、ページを確認したところ、ソース コードに次のエラーが表示されていました。
SQLSTATE[00000] [1040] Too many connections
エラーもログに記録し、上記のメッセージのみが表示されます。
PHP アプリケーションでは、多くの要求がありますが、特定の 1 つのテーブルに対してのみです (結合はありません ...)。データベース接続には独自のクラスも使用します。そこには、以前に設定されていない場合に設定されるハンドルがあります。
if($this->_handle == null){
$this->Connect();
}
try{
// make query
}
catch(PDOException $e){
echo "An error occured: {$e->getMessage()}";
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}
したがって、リクエストごとに新しい接続のようなものがあってはなりません。しかし、接続を閉じることはありません (どこで閉じるべきかわかりません)。
- ユーザーごとに新しい接続が作成されますか、それとも同じ接続が複数のユーザーに使用されますか?
- 接続が利用可能かどうかをコードで確認し、悪意のあるページを表示する代わりに、対応するメッセージをユーザーに表示するにはどうすればよいですか?
- あまりにも多くの接続が使用されているという私のコードに何か問題がありますか?
- 接続が成功した場合、どのようにログに記録できますか?
これは私の接続機能です:
public function Connect(){
try{
$this->_handle = new PDO("mysql:host={$this->dbhost};dbname={$this->dbname}", $this->dbuser, $this->dbpasswd);
$this->_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo "An error occured: {$e->getMessage()}";
file_put_contents('PDOErrors.txt', $e->getMessage() . chr(10) . chr(13), FILE_APPEND);
}
}
このエラーの後、インターネットを検索しようとしました。これは私が見つけたものです:
MySQL サーバー 5.0.77 ->マニュアル
phpinfo() がロックされた PHP 5.2.9
show variables like 'max_connections';
私に1000を与えます!
使用するSHOW STATUS;
と、次のように表示されます。
Aborted_clients 16
Aborted_connects 15248
Connections 1694699
Max_used_connections 1001
Queries 266398903
Table_locks_immediate 36136077
Table_locks_waited 40387
Threads_connected 2
Threads_created 1694698
Threads_running 2
Uptime 2143256
- 1 日でこのクエリ数に達していないと思いますが、これは共有ホストですか?
- 接続が多すぎる問題に対して何ができますか?
現在、すべてが正常に機能していますが、システムが稼働し、より多くのユーザーが使用するようになった場合、この問題は望ましくありません。