我有一个使用 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
从它的声音来看,数据库连接失败了,但是,当工作人员删除作业并获取下一个作业时,使用相同的连接它可以正常工作。这是什么意思?