0

PHP mysql_connect は、「接続が多すぎる」ために失敗することがあります。プロセス ステータス リストを確認すると、これが発生すると、非常に長いプロセスがスリープ状態になっていることがわかります。どのぐらいの間?時間:28490

これは私が接続を開始する方法です:

            $this->connection[$server] = mysql_connect( $credentials['dbUrl'], $credentials['dbUser'], $credentials['dbPass'], true);

これは常に発生するわけではなく、接続が「スタック」することがあります。ページ上の何かが終了していないことに関係があるのではないかと思います(画像が読み込まれていない?外部サービスが動かなくなった?)。スクリプトが正式に終了するのはいつですか? ページが完全にロードされた後ですか?

私は 2 つの可能な解決策を考えました。 1. mysql_close を使用します。2. 最大 mysql タイムアウトの変更 ( /etc/my.cnf) 3. スクリプトのタイムアウトを処理します。

接続が「スリープ」状態になる原因は何ですか? 問題を解決/さらに調査するには、どのように提案しますか?

4

1 に答える 1

1

これに対する適切な解決策は、接続を関数に入れ、デストラクタを追加して接続を閉じることです。そうすれば、最後に mysql 接続が呼び出された後、接続は自動的に閉じられます。

class DbConn {
    public $connection;

    public function __construct($host, $name, $user, &$pass) {
        $this->connection = mysql_connect(mysql_connect($host, $user, $pass);
        if(mysql_connect_errno) {
            echo mysql_connect_error;
        } else {
            mysql_select_db($name, $this->connection);
        }
        unset($pass); //Clear password for security.
    }

    public function __destruct() {
        mysql_close($this->connection);
    }
}

スクリプトがイメージでハングした場合でも、スクリプトが終了する前に閉じられるため、開いているほとんどの接続を処理する必要があります。最後のクエリが実行された後に接続が閉じます。too many connectionsおそらくまだいくつか取得できますが、エラーが発生するほどではありません。

于 2013-07-03T14:53:10.533 に答える