2

そのため、解決できないPHP PDOでスクリプトを実行すると、この問題が発生します。私のスクリプトは、異なるサーバー上の異なるデータベースからの情報のインデックスを作成しています (主に Select クエリ)。

スクリプトを開発していたとき、すべてのデータベースは同じサーバー上にあり、すべて正常に動作していました。データベースを 3 つの異なるサーバーに移動したので、この恐ろしいエラーが発生します。

これは、スクリプトを実行するたびに起こることです:

スクリプトは、次の単純なクエリを実行するポイント (そして毎回そこでクラッシュする) まで、正常に実行されます。

(注、スクリプトが入っており、DBにアクセスして操作するためにPHP使用しています)PHP PDO

SELECT *
FROM a_table
WHERE a_column = a_value.

その後、クラッシュし、次のエラーが発生します。

[a_date] - trunk - FATAL - Unmanaged Exception of type 'App_Exception'
File: /.../.../.../a_php_file.php
Line: a_line
Message: Error executing query.
Info:
Array
(
    [0] => HY000
    [1] => 2006
    [2] => MySQL server has gone away
)

Trace:
 #0 /.../.../.../a_php_file.php(124): App_something::a_metho('a_variable...')

私は長い間検索しましたが、まだ解決策が見つかりません。

私は試した:

  • /etc/my.cnf (クラッシュが発生した sql) の max_allowed_pa​​cked を変更して、16M から 64M に設定します (クエリが返す結果は実際にはそれほど大きくありません)。

  • 既存の接続を強制終了するのを忘れた場合に備えて、max_connections を変更して、より多くの接続を許可します。

  • ネットワーク上の問題を確認する

  • ホストからリモートSQLサーバーへの接続など、他の多くの小さなこと。

本当に奇妙なのは、クエリを単独で実行しても問題なく動作し、すべてのデータベースが同じサーバー上にある場合でも問題なく動作することです。

私はこの時点で本当に迷っており、問題がどこから来るのか見当がつかないので、助けやヒントを求めに来ています.

これは、例外でクラッシュするメソッドです。

public static function my_method($my_mysql_WHERE_variable)
{
    //======================================
    // cached?
    //======================================
    if(isset(self::$_table1[$my_mysql_WHERE_variable])) {
      return self::$_table1[$my_mysql_WHERE_variable];
    }

    $pdo = my_App::getConnection();

    $query = "SELECT *
              FROM
                a_table
              WHERE
                a_column = :my_mysql_WHERE_variable";
    $stmt = $pdo->prepare($query);

    if($stmt === false) { 
        **---------------IT CRASHES HERE-----------**
        throw new my_App_Exception("Error executing query.\nInfo:\n" . print_r($pdo->errorInfo(), true)); 
    }
    .
    .
    .
    return $a_value;
}
4

2 に答える 2

1

おそらく、DB 接続に問題がある場合があります。この DB への DB 接続を別の場所で誤って閉じていませんか? 実行しようとしているクエリの正しい接続を参照していませんか?

于 2012-09-05T18:07:39.157 に答える
0

このエラーの理由は、tcp 接続のタイムアウトがあったためであることがわかりました。クエリが実際にはかなり短い場合でも、なぜタイムアウトになるのか、まだ自分では説明できませんが、/etc/sysctl.conf を変更し、キープアライブの値を高く設定することで問題を解決できました。もちろん、実際の解決策は各クエリを読み取り、それらを最適化することであることはわかっています:)

于 2012-09-11T14:35:53.120 に答える