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();