У меня есть среда, в которой я использую 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
Судя по всему, соединение с базой данных не удалось, однако, когда работник удаляет задание и получает следующее, оно работает просто отлично, используя то же соединение. Что это значит?
Задача ещё не решена.
Других решений пока нет …