我的应用程序有几个作业可以处理上传的CSV文件。这些文件可能很大,因此它们由队列工作器处理。我的所有工作都可以正常工作,只有一项工作似乎从未完成。该作业通常比其他作业花费更长的时间,因此我使用php artisan queue:work --timeout=300 --sleep=3
运行队列工作器,以使该进程不会自动被杀死。这项工作实际上并不需要5分钟,最多大约是1:30。
但是奇怪的是,它没有停留在无限循环之类的东西上,实际上到达了Job类的handle()
方法的最后一行(这是Log::info()
,它告诉我该工作已完成)。在工作控制台中,Processed
永远不会显示,并且该线程固定为100%CPU使用率。有趣的是,作业运行时线程的CPU占用率约为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循环已按预期完成,并且处理Job的最后一行已到达。
该作业通常比其他作业需要更长的时间来处理吗?我必须使用--timeout=300
,因为队列进程之前会被杀死。我可以使用--timeout=300
执行任何其他作业,尽管它们可以完成...日志中没有错误。我只是从最后一行看到Log::info()
,仅此而已。我尝试将return;
添加到Job类,但是没有运气。
我在MacBook Pro上使用最新的Homestead
感谢您的帮助。