Мое приложение имеет несколько заданий для обработки загруженных файлов CSV. Эти файлы могут быть довольно большими, поэтому они обрабатываются в очереди. Все мои работы работают хорошо, кроме одной, которая никогда не заканчивается. Это задание обычно занимает немного больше времени, чем другие, поэтому я запускаю работника очереди с php artisan queue:work --timeout=300 --sleep=3
, чтобы процесс автоматически не прерывался. Работа на самом деле не занимает 5 минут, максимум около 1: 30.
Странно то, что он не застрял в каком-то бесконечном цикле или чем-то еще, последняя строка метода handle()
класса Job фактически достигнута (это Log::info()
, который говорит мне, что задание имеет законченный). В рабочей консоли Processed
никогда не отображается, а поток закрепляется при 100% -ной загрузке ЦП. Интересно, что поток находится на уровне около 85% ЦП во время выполнения задания и фактически увеличивается до 100% после его завершения. На самом деле он не будет работать вечно, когда будет достигнут --timeout
, который я указал в работнике очереди, процесс прекратится.
Задание инициируется так же, как и любое другое задание (контекстуально):
// I use repository classes in my application, which are called from Controllers.
// In this case, the processFile method inside my ImportRepository dispatches the job that
// will process the file.
public function processFile(UploadedFile $file, string $type, $delimiter = ';') : Import
{
// Each uploadable file has it's own class which defines the columns etc. This function
// will initiate that class for the uploaded file. It also has information on which job
// to call etc. which is used later
$import = $this->getImportClassForType($file, $type);
// Model is a Eloquent model to track the status, create it
$model = $this->create([
'type' => $type,
'started_on' => Carbon::now(),
'status' => 'initiated',
'line_count' => $file->getLineCount(),
]);
// Returns the specific job to dispatch to handle this type of file.
$import::getValidationJobClass()::dispatch($import, $model);
return $model;
}
Фактическая задача обработки довольно проста, она имеет цикл foreach для итерации по строкам файла CSV. Я не думаю, что проблема заключается в этом, так как этот цикл foreach завершен, как и ожидалось, и достигнута последняя строка задания обработки.
Может ли это быть связано с тем, что работа обычно занимает немного больше времени, чем любая другая? Мне пришлось использовать --timeout=300
, потому что процесс очереди был бы убит раньше. Я могу выполнить любое другое задание с помощью --timeout=300
, и они будут завершены, хотя ... В журналах нет ошибок. Я просто вижу Log::info()
из последней строки и все. Я попытался добавить return;
в класс Job, но безуспешно.
Я использую последнюю версию Homestead на MacBook Pro
Любая помощь приветствуется.