php MySQLi随机和临时致命错误

xoshrz7s  于 2022-11-28  发布在  PHP
关注(0)|答案(1)|浏览(113)

我有一个使用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查询只是等待轮到它,而不是正确的崩溃。
不幸的是,如果是这种情况,我没有办法测试甚至修复它,所以我需要一个变通办法。如果不是这种情况,我需要一些指导,以了解原因是什么以及如何排除故障/修复它。

Update按照注解中的建议,我检查了mysql错误代码和错误消息。结果是:

(2006) MySQL server has gone away

从声音上看,数据库连接失败了,但是,当工作线程删除作业并抓取下一个作业时,它使用相同的连接工作得很好。这意味着什么?

oprakyz7

oprakyz71#

您缺少“. .”来concat $table。预准备语句应为:

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

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

相关问题