【问题标题】:Laravel 5 queue job freezesLaravel 5 队列作业冻结
【发布时间】:2026-02-02 23:45:02
【问题描述】:

我正在实现一个处理上传文件的命令。

这些文件最多可以包含 300MB 的数据,因此需要对作业进行排队,而且我还预计需要一段时间才能完成。

我的问题是,当我运行 php artisan queue:listen 时,它从队列中获取作业,开始正常处理它,但大约 20 秒后,它冻结了。该作业不会启动任何异常,也不会继续,因此不会从队列中删除。

我正在使用database 驱动程序。是不是漏了什么?

【问题讨论】:

  • 不看代码,很难找到问题。

标签: php laravel laravel-5


【解决方案1】:

php artisan queue:listen 不会为用户输出错误。运行php artisan queue:work,它将输出错误。此命令只会运行队列中的一个进程。所以你需要确保下一个进程是你要调试的那个。

【讨论】:

  • 它也会冻结。我发现了我的“错误”。这是一种错误。 fgetcsv 读了很多行后,返回 null 而不是 FALSE。所以我陷入了无限循环。
  • 多少行?您可能已用尽内存限制。尝试在代码顶部添加此语句 ini_set('memory_limit', -1);。这将删除您的 php 的内存限制。
  • 7000 行。这很奇怪,因为我使用的是SplFileInfo。通过这种方式,当我期待 false 出现错误或文件结尾时,它在某处返回 null。所以我将其更改为使用常见的fopen 方式。通过这种方式,我实际上读取了所有文件并在文件末尾收到false。问题是并非所有行都被读取。大约 10% 没有被读取。很奇怪。正在考虑提出另一个问题。
【解决方案2】:

也许它没有冻结,但是当您在运行 php artisan queue:work 或 php artisan queue:listen 命令后在命令行界面中没有看到任何事情时,它似乎冻结了。

就我而言,

// 在命令行界面按队列名执行Laravel队列->

我正在使用运行命令 php 工匠队列:工作
它没有在作业表中运行我排队的作业。

然后我重新解释了,它只适用于队列列值 = 'default' 的作业 并且我已经给出了 sendemail、inboxemail 等名称。

所以当我在作业表的队列列中将这个其他值更改为“默认”时, 当我打开 cli 和 php artisan queue:work 时,这项工作立即运行 命令已激活。

因此,如果您只想按队列名称运行特定队列,请运行命令 ->

php artisan queue:listen --queue=sendemail

php artisan queue:listen --queue=inboxemail

【讨论】:

    【解决方案3】:

    对于任何和我一样犯过错误的人,不要根据“工作”表创建表!

    这不是内存泄漏或某事。我有另一个表“job_info”,其外键引用jobs 表;事实证明,laravel 在成功完成后无法从表中删除作业(就像通常那样)。那是因为它会破坏数据库中的关系。因此,它会不断重试,直到超过最大尝试次数,从而导致没有关于实际问题的信息的异常。

    【讨论】: