定时长任务,内存资源回收问题,望不吝赐教

hansliao

用WORKERMAN做了一台推送/定时任务系统,推送功能基本是白天才会有流量,晚上的时候会跑一些大量数据的任务(数据统计什么的),请问用WM的定时器执行这些任务之后可以自动释放对象资源么?还是需要手动释放?释放的内存方便给白天的推送服务使用。@walker

6132 2 0
2个回答

hansliao

夜间定时任务代码是已自定义类方法的方式在定时器中调用

  • 暂无评论
walkor

workerman内存回收机制完全遵循php原有的GC机制。在workerman里业务代码都是在函数或者类方法里运行的,根据php的回收机制,函数或者类方法里临时变量会自动回收。所以开发时基本不用考虑内存回收问题,也不会有内存泄漏,不需要手动unset。
 
满足以下条件的变量需要注意:
1、global关键字的全局变量,并且变量是数组(不是数组不用关心)
2、static关键字的类的静态变量,并且变量是数组(不是数组不用关心)
3、给worker对象临时赋值的属性,比如 worker->uidlist,并且这个属性是数组(不是数组不用关心)
 
以上三种变量是数组的情况下需要注意,这些变量因为不属于临时变量,所以会一直存在于内存,注意不要让数组里面的数据无限增加,否则会导致内存泄漏。
 
另外定时器也需要注意,定时器也是用一个类的静态数组存储,如果无限增加定时器又从不删除,会导致内存泄漏。

  • hansliao 2018-11-02

    如果我单独new 已Worker类 其中一个子进程只运行一个定时器,一个定时只运行一个计划任务,任务完成后stopAll当前的子进程,这种方式是否可行?

  • walkor 2018-11-02

    stopAll当前的子进程没看到有什么意思

  • hansliao 2018-11-02

    意思我能不能在一个定时任务完成后重启当前子进程

  • hansliao 2018-11-02

    $task_worker = new Worker();
    $task_worker->name = 'TaskWorker';
    $task_worker->count = 2;
    $task_worker->onWorkerStart = function($task_worker)
    {
    $time_interval = 1;
    Timer::add($time_interval, function()
    {
    //计划任务
    $t = new Test();
    $t->test();
    //停止当前子进程
    Worker::stopAll();
    });
    };
    比如这样的代码

  • walkor 2018-11-02

    可以

  • hansliao 2018-11-02

    @1:好的万分感谢

年代过于久远,无法发表回答
🔝