1

昨日はすべて正常に機能していました。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);
}

したがって、リクエストごとに新しい接続のようなものがあってはなりません。しかし、接続を閉じることはありません (どこで閉じるべきかわかりません)。

  1. ユーザーごとに新しい接続が作成されますか、それとも同じ接続が複数のユーザーに使用されますか?
  2. 接続が利用可能かどうかをコードで確認し、悪意のあるページを表示する代わりに、対応するメッセージをユーザーに表示するにはどうすればよいですか?
  3. あまりにも多くの接続が使用されているという私のコードに何か問題がありますか?
  4. 接続が成功した場合、どのようにログに記録できますか?

これは私の接続機能です:

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. 1 日でこのクエリ数に達していないと思いますが、これは共有ホストですか?
  2. 接続が多すぎる問題に対して何ができますか?

現在、すべてが正常に機能していますが、システムが稼働し、より多くのユーザーが使用するようになった場合、この問題は望ましくありません。

4

0 に答える 0