Поймать фатальную ошибку на работниках php gearman

Когда рабочее задание не выполнено из-за фатальной ошибки, я не могу перехватить эту ошибку, поэтому я не могу отправить результат на сервер Gearman, и сервер не удаляет задание из очереди, и он пытается выполнить это задание снова, перезапуск работника супервизора и сбой работника. Так что я могу получить бесконечный цикл до перезапуска сервера:

gearman отправляет задание работнику -> работник не работает из-за фатальной ошибки -> задание не удаляется из очереди -> перезапускается руководитель работника -> gearman отправляет задание работнику -> …

(конечно, только если я не смогу быстро исправить ошибку в php). Как я могу удалить эту работу из очереди (или решить эту проблему другим способом)?

Простой пример:

$worker->addFunction('test', 'test');
while($worker->work());

function test()
{
$a = [];
//fatal error
$a->fatal();
}

0

Решение

Если вы входите, как я, в поисках метода, чтобы поймать фатальную ошибку и отправить ее обратно работнику.
Итак, вам нужно использовать функцию 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";
}
0

Другие решения

Эта строка создает бесконечный цикл:

while($worker->work());
-1

По вопросам рекламы [email protected]