Php 在运行查询之前,如何检查PDO MySQL连接是否存在错误?

Php 在运行查询之前,如何检查PDO MySQL连接是否存在错误?,php,mysql,pdo,pcntl,Php,Mysql,Pdo,Pcntl,我的脚本在很多不同的函数中都有很多分叉的进程。每当调用pcntl\u fork()时,所有MySQL连接都会丢失。如果我在PDO MySQL连接上运行查询,就会出现错误“MySQL服务器已消失” 问题是,此错误仅在执行失败的查询后出现在PDO::errorinfo()中。在我尝试运行查询之前,我希望能够检测到MySQL服务器是否已经“消失”。这样我就可以创建一个PDO包装器,在这种情况下为我创建一个新的连接 有什么想法吗?我举了两个例子(在某些方面类似): 例1: $sql = 'SELECT

我的脚本在很多不同的函数中都有很多分叉的进程。每当调用
pcntl\u fork()
时,所有MySQL连接都会丢失。如果我在PDO MySQL连接上运行查询,就会出现错误“MySQL服务器已消失”

问题是,此错误仅在执行失败的查询后出现在
PDO::errorinfo()
中。在我尝试运行查询之前,我希望能够检测到MySQL服务器是否已经“消失”。这样我就可以创建一个PDO包装器,在这种情况下为我创建一个新的连接


有什么想法吗?

我举了两个例子(在某些方面类似):
例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().'. ';
        }
    }
}

仅供参考:这已经作为一个bug报告了好几次,到目前为止还没有修复(5.3.14)。唯一的解决方案是在每次分叉一个子节点后都进行一次新连接,并设置PDO::ATTR_PERSISTENT=>false

如何修复导致该错误的问题?你需要治愈疾病,而不仅仅是隐藏症状。错误的原因不是分叉吗?这不意味着每次分叉时都必须创建一个新连接吗?分叉很可能是问题的原因。理想情况下,您应该先分叉,然后打开一个连接。如果这是不可能的,文档中的这条评论可能会有所帮助:另请参阅-特别是关于分叉的一行。谢谢链接。他们证实了我猜测的一切。但这对我的问题并没有真正的帮助。我的许多函数都会分叉子进程,其中许多函数都是在多种情况下调用的。每次调用可能产生子进程的函数并手动创建新连接时,都要跟踪,这实在是太多的工作了。在我尝试运行查询之前,我所需要的只是一些方法来检测连接是否已丢失。@Codemonkey:只需使用您自己的函数包装PDO的查询,并检查它是否已成功执行。如果没有,就重新做吧。
// 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();