【问题标题】:Laravel queues getting "killed"Laravel 队列被“杀死”
【发布时间】:2018-01-14 07:04:31
【问题描述】:

有时当我将大型数据集发送到作业时,我的队列工作人员突然退出。

// $taskmetas is an array with other arrays, each subsequent array having 90 properties.
$this->dispatch(new ProcessExcelData($excel_data, $taskmetas, $iteration, $storage_path));

ProcessExcelData 作业类使用 box/spout 包创建一个 excel 文件。

  • 在第一个示例中,$taskmetas 有 880 行 - 工作正常
  • 在第二个示例中,$taskmetas 有 10,000 行 - 突然退出

第一个示例 - 使用小数据集进行队列输出:

forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 02:44:48] Processing: App\Jobs\ProcessExcelData
[2017-08-07 02:44:48] Processed:  App\Jobs\ProcessExcelData

第二个示例 - 使用大型数据集进行队列输出:

forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 03:18:47] Processing: App\Jobs\ProcessExcelData
Killed

我没有收到任何错误消息,日志为空,并且作业没有出现在 failed_jobs 表中,与其他错误一样。时间限制设置为 1 小时,内存限制设置为 2GB。

为什么我的队列突然退出?

【问题讨论】:

标签: laravel laravel-5 queue


【解决方案1】:

您可以尝试设置超时。 例如。 php 工匠队列:工作 --timeout=120

默认情况下,超时时间为60秒,所以我们如上所述强制覆盖超时时间

【讨论】:

  • 时间限制设置为 1 小时 - 作业在 5 分钟内终止。
  • 那么在您的情况下,代码中可能存在一些问题或内存问题
【解决方案2】:

这对我有用:

我有一份主管工作:

Job ID, Queue, Processes, Timeout, Sleep Time, Tries, Action Job_1,
Default, 1, 60, 3, 3

https://laravel.com/docs/5.6/queues#retrying-failed-jobs 说:

要删除所有失败的作业,您可以使用 queue:flush 命令:

php artisan queue:flush

所以我这样做了(在运行 php artisan queue:failed 以查看有失败的作业之后)。

然后我删除了我的 Supervisord 作业并创建了一个类似但有 360 秒超时的新作业。

同样重要的是要记住重新启动 Supervisord 作业(在我的 Cloudways 应用程序的控制面板中)并重新启动整个 Supervisord 进程(在我的 Cloudways 服务器的控制面板中)。

在尝试再次运行我的作业后,我在 failed_jobs 表中注意到它,并读到该异常与缓存文件权限有关,因此我在我的应用程序的 Cloudways 仪表板中单击了重置权限按钮。

【讨论】:

    【解决方案3】:

    我知道这不是您想要的。但我有同样的问题,我认为它发生在操作系统的 bcs (如果我找到确切的原因,我会改变它)但让我们检查一下

    queue:listen
    

    而不是

    queue:work
    

    这两者之间的主要区别在于 queue:listen 为每个作业运行 Job 类代码(因此您不需要重新启动您的工作人员或主管)但 queue:work 使用缓存系统并且比 queue:listen 工作得更快操作系统无法处理这种速度并准备队列连接(在我的情况下是 Redis)

    queue:listen 命令将运行 queue:work 在它自己(你可以从你的运行中检查这个 htop 或 .. 中的进程

    但是告诉你检查 queue:listen command 的原因,speed的bcs。操作系统可以以这种速度轻松工作,并且处理您的队列连接没有问题......(在我的情况下,不再有静默杀死)

    要知道您是否遇到我的问题,您可以将队列驱动程序从 .env 更改为“同步”,看看它是否再次被杀死 - 如果它没有被杀死,您可以知道问题在于准备队列连接以供使用

    • 要知道你是否有内存问题,用listen方法或sync运行你的队列,php会为此返回一个错误,然后你可以增加你的内存来再次测试它

    • 您可以使用此代码为代码中的测试提供更多内存

      ini_set('memory_limit', '1G');//1 GIGABYTE
      

    【讨论】:

      【解决方案4】:

      有时您会处理资源密集型流程,例如图像转换或 BIG excel 文件创建/解析。而超时选项是不够的。你可以在你的工作中设置public $timeout = 0;,但它仍然因为内存(!)而被杀死。默认情况下,内存限制为 128 MB。要修复它,只需添加 --memory=256(或更高)选项即可避免此问题。

      顺便说一句:

      时间限制设置为1小时,内存限制为2GBs

      这仅适用于您的情况下的 php-fpm,但不适用于队列进程工作者。

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2020-11-13
        • 2015-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多