Laravel 5.1 队列,使用内存不断增长的问题。

使用的是laravel 5.1,队列放在redis里

使用supervisor管理,php artisan queue:work connection --daemon --sleep=3 --tries=3。基本就是按照文档做的。

现在的问题是,队列一直有很多 job 在处理,服务器上这些work占用的内存一直在增长。

我的理解是,这是一个php的守护进程,php 并不会主动的释放内存,不断的处理任务,所以内存一直在增加。所以需要手动unset掉所有的变量,或者调用 gc_collect_cycles 强制处理垃圾,或者定时重启所有 work 让进程结束,让php释放内存?

<?php
class Foo
{
    public $var = '3.1415962654';
}

$baseMemory = memory_get_usage();

$startTime = microtime();
for ( $i = 0; $i <= 100000; $i++ )
{
    $a = new Foo;
    $a->self = $a;
    if ( $i % 500 === 0 )
    {
        echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
    }

     # 1.手动unset
    //unset($a->self);
    //unset($a);

      # 2.最后调用gc_collect_cycles
    //gc_collect_cycles();
}

写了个脚本,1,2两种方法都有用,

我的理解对吗?大家是怎么处理这个问题的?

liyu001989
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
Summer

--daemon 选项强制队列服务器持续处理任务,而不需要重新启动整个框架。

应该是你有一些资源没注意释放掉,文档里面有这段:http://learnku.com/docs/laravel/5.1/queues#在后台服务的队列侦听器中开发时所要考量的事项

7年前 评论

daemon 不重启框架

7年前 评论
liyu001989
在后台运行的队列侦听器在处理完每个任务前不会重新启动框架。因此你应该在任务运行完成前,谨慎地释放所有内存占用较高的资源。例如你利用 GD 函数库来处理图片,就要在结束前用 imagedestroy 来释放内存。

如果你的数据库连接也要在使用完后进行关闭,则可以用 DB::reconnect 方法来确保有新的数据库进行连接。

demon守护进程,不重启框架,所以需要手动unset掉变量,释放内存。

那么其实所有的变量都是需要释放的啊,不然内存涨上来只是时间的问题?

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!