MySQLi случайная и временная фатальная ошибка
У меня есть среда, в которой я использую beanstalkd и pheanstalk для асинхронной очереди и обработки заданий. Один из моих работников передал имя таблицы MySQL и идентификатор строки вместе с другой информацией. Затем этот работник обновляет эту строку этой таблицы.
Это хорошо работает в 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
Судя по всему, соединение с базой данных не удалось, однако, когда работник удаляет задание и получает следующее, оно работает просто отлично, используя то же соединение. Что это значит?
1 ответ
Вам не хватило ".." объединить $table. Подготовленное заявление должно быть:
$stmt = $mysqli->prepare("UPDATE `database`.`".$table."` SET `Limit` = ? WHERE `D_ID` = ?");
$stmt->bind_param("si", $Limit, $rowID);
$stmt->execute();
$stmt->close();
Функция подготовки завершается ошибкой, если запрос не на 100% идеален.