6

私のスクリプトは、多くの異なる関数でフォークされたプロセスでかなりだらけになっています。が呼び出されるたびpcntl_fork()に、すべてのMySQL接続が失われます。PDO MySQL接続でクエリを実行すると、エラーが発生します"MySQL server has gone away"

問題は、このエラーPDO::errorinfo()がクエリの実行に失敗した後にのみ表示されることです。クエリを実行する前に、MySQLサーバーが「なくなった」かどうかを検出できるようにしたいと思います。そうすれば、そのような状況で新しい接続を確立するPDOラッパーを作成できます。

何か案は?

4

2 に答える 2

2

例として2つの方法を示します(いくつかの点で類似しています):
例1:

$sql = 'SELECT count(*) FROM `TABLE`;';
for ($i = 1; $i <= 2; $i++) {
    try {
        $nb = $pdo->query($sql)->fetchColumn();
        if (is_int($nb)) {
            // OK
            break;
        }
    } catch (PDOException $e) {
    //Oups
        if ($i == 1) {
            // First time ? retry
            $pdo = new PDO($dsn, $user, $password);
        } else {
            // Second time, KO
            $nb = "(unknown)";
            echo 'PDO Connection failed: ' . $e->getMessage().'. ';
        }
    }
}

例2:

// check
try {
    $pdo->query('select 1;')
    //OK
} catch (PDOException $e) {
    //Oups => reconnect
    $pdo = new PDO($dsn, $user, $password);
}
// Should be good
$sql = 'SELECT count(*) FROM `TABLE`;';
$nb = $pdo->query($sql)->fetchColumn();
于 2011-07-31T09:30:54.057 に答える
2

参考:これはバグとして1、2、3回報告されており、これまでのところ修正されていません( 5.3.14)。唯一の解決策は、子をフォークした後、毎回新しい接続を行い、PDO :: ATTR_PERSISTENT=>falseを設定することです。

于 2012-07-16T20:15:18.540 に答える