MySQLi随机和临时致命错误



我有一个使用beanstalkd和pheanstalk异步排队和处理作业的环境。我的一个工作人员被传递了MySQL表名、行id以及其他信息。然后,该工作者更新该表的那一行。

这99%的时间都很好。然而,偶尔我的员工会崩溃:

PHP Fatal error:  Call to a member function bind_param() on a non-object in /path/to/file.php on line 62

如前所述,同一行99%的时间执行良好,但偶尔会崩溃。它崩溃的作业尚未删除,并保留在队列中等待另一个工作进程重新处理。因此,当我重新启动工作程序时,它会处理与它刚才崩溃的相同的作业,而不会出现问题。

我的PHP看起来像这样:

$stmt = $mysqli->prepare("UPDATE `database`.`$table` SET `Limit` = ? WHERE `D_ID` = ?");
$stmt->bind_param("si", $Limit, $rowID);
$stmt->execute();
$stmt->close();

我能想到的最好的情况是,因为这是异步的,所以在执行时,其他进程恰好锁定了该表/行。我想MySQL查询只是等待它的回合,而不是正确的崩溃。

不幸的是,如果是这种情况,我没有办法测试甚至修复它,所以我需要一个解决方案。如果不是这样的话,我需要一些关于原因是什么以及如何排除故障/修复它的指导。

更新正如评论中所建议的,我检查了mysql错误代码和错误消息。结果是:

(2006) MySQL server has gone away

从声音上看,数据库连接已经失败,但是,当工作人员删除作业并获取下一个作业时,使用相同的连接可以正常工作。这是什么意思?

你缺少"quot;以插入$table。准备好的声明应该是:

$stmt = $mysqli->prepare("UPDATE `database`.`".$table."` SET `Limit` = ? WHERE `D_ID` = ?");
$stmt->bind_param("si", $Limit, $rowID);
$stmt->execute();
$stmt->close();

如果查询不是100%完美,则prepare函数将失败。

最新更新