如何在Laravel中检查队列的状态?

Bre*_*ite 5 laravel laravel-queue

我需要向Laravel队列提交大量作业,以处理一些上传的CSV文件。如果文件较小,则这些作业可以在一秒钟内完成;如果文件较大,则可以在几秒钟内完成;如果CSV文件很大,则可能需要一分钟才能完成。而且我无法提前告知文件的大小。

当用户转到“结果”页面时,我需要显示结果-但前提是队列已完成作业。如果队列仍在处理中,则需要显示“稍后重试”消息。

所以-有没有一种方法可以从控制器检查队列是否已完成?

我目前正在使用Laravel 5.1,但如果有帮助的话,会很乐意升级。而且我目前正在使用数据库队列驱动程序。理想情况下,我很想找到一种适用于所有队列驱动程序的通用技术,但是如果唯一的方法是检查数据库表,那么我想这就是我要做的。

谢谢!

小智 7

我知道这已经有一年了,但为什么不根据该请求使用唯一键为每次上传创建一个新队列。

$job = (new ProcessCSVJob($data))->onQueue($uniqueQueueName);
Run Code Online (Sandbox Code Playgroud)

如果您想要仅数据库解决方案,您可以简单地在数据库中的队列名称字段中进行计数。

要处理所有队列类型,您可以使用 Queue size 方法返回队列大小。

$queue = App::make('queue.connection');
$size = $queue->size($uniqueQueueName);
Run Code Online (Sandbox Code Playgroud)

这是在 Laravel 5.4 中。不确定这是如何向后兼容的。

  • 这在 L5.6 中非常有效。另一种获取大小的方法是通过 `Queue` 门面:`$size = \Queue::size($uniqueQueueName);`。我注意到如果命名队列不存在,一些队列驱动程序可能会引发异常。我不确定这是否是驱动程序中的错误,但这是需要考虑的事情。如果 IoC 容器名称('queue.connection')在内部发生变化,则使用 Facade 可能会更健壮。 (4认同)

woe*_*ens 0

从版本 8 开始,laravel 提供了批处理的概念,您可以使用它来监控作业的进度。