Когда рабочее задание не выполнено из-за фатальной ошибки, я не могу перехватить эту ошибку, поэтому я не могу отправить результат на сервер Gearman, и сервер не удаляет задание из очереди, и он пытается выполнить это задание снова, перезапуск работника супервизора и сбой работника. Так что я могу получить бесконечный цикл до перезапуска сервера:
gearman отправляет задание работнику -> работник не работает из-за фатальной ошибки -> задание не удаляется из очереди -> перезапускается руководитель работника -> gearman отправляет задание работнику -> …
(конечно, только если я не смогу быстро исправить ошибку в php). Как я могу удалить эту работу из очереди (или решить эту проблему другим способом)?
Простой пример:
$worker->addFunction('test', 'test');
while($worker->work());
function test()
{
$a = [];
//fatal error
$a->fatal();
}
Если вы входите, как я, в поисках метода, чтобы поймать фатальную ошибку и отправить ее обратно работнику.
Итак, вам нужно использовать функцию set_exception_handle и set_error_handle
http://php.net/manual/en/function.set-exception-handler.php
Затем вы должны реализовать в своем клиенте failCallback и exceptionCallback для захвата этих сбоев.
На рабочем месте вы должны добавить функцию, которая отправляет обратно исключение.
public function exception_handler($exception) {
$this->job->sendException('Boom');
}
Клиент поймает исключение при обратном вызове
public function verifyExceptionTask (GearmanTask $task) {
$m = $task->data();
echo "ID Unique: " . $task->unique() . "\n";
echo "Exception: {$m} " . GEARMAN_WORK_EXCEPTION . "\n";
}
Эта строка создает бесконечный цикл:
while($worker->work());