У меня есть задание, которое отправляется с двумя аргументами - path и filename в файл. Задание анализирует файл с помощью simplexml, затем уведомляет об этом в базе данных и перемещает файл в соответствующую папку для сохранения. Если что-то пойдет не так, оно перемещает файл в другую папку для файлов с отказами, а также создает событие, чтобы дать мне уведомление.Как устранить неполадки при работе с нулями в очереди?
Моя проблема заключается в том, что иногда работа будет терпеть неудачу. Задача удаляется из очереди, но файл не анализируется и остается в том же каталоге. Таблица failed_jobs пуста (я использую драйвер очереди базы данных для разработки), и метод failed()
не был запущен. Метод Queue::failing()
, который я установил в поставщик услуг приложения, также не был запущен - я знаю, поскольку оба из них содержат только один вызов журнала, чтобы проверить, были ли они удалены. Журнал Laravel пуст (он доступен для чтения, и Laravel пишет для него другие ошибки - я дважды проверял), а также соответствующие файлы системного журнала, такие как, например, PHP.
Сначала я думал, что это проблема с таймаутом, но прослушиватель очереди не потерпел неудачу, не остановился и не был перезапущен. Я все равно увеличил тайм-аут до 300 секунд и подтвердил, что все строки «[datetime] Processed: [job]», которые генерирует слушатель, были в пределах этого промежутка времени. Время выполнения Php и т. Д. Также намного больше, чем требуется для этой работы.
Так как же я могу устранить это, когда журналы пусты, ничего не появляется, и я не получаю уведомления о том, что не так? Если я поставил в очередь 200 файлов, тогда, возможно, 180 будет обработано, а остальные 20 будут терпеть неудачно. Если я обновляю базу данных + миграцию и снова стану в очередь на 200 же, тогда, возможно, 182 будет обработано, а 18 будет терпеть неудачу - но они не обязательно будут одинаковыми.
Мой метод ручки, упрощена, чтобы показать соответствующие биты, выглядит следующим образом:
public function handle()
{
try {
$xml = simplexml_load_file($this->path.$this->filename);
$this->parse($xml);
$parsedFilename = config('feeds.parsed path').$this->filename;
File::move($this->path.$this->filename, $parsedFilename);
} catch (Exception $e) {
// if i put deliberate errors in the files, this works fine
$errorFilename = config('feeds.error path').$this->filename;
File::move($this->path.$this->filename, $errorFilename);
event(new ParserThrewAnError($this->filename));
}
}