用WORKERMAN做了一台推送/定时任务系统,推送功能基本是白天才会有流量,晚上的时候会跑一些大量数据的任务(数据统计什么的),请问用WM的定时器执行这些任务之后可以自动释放对象资源么?还是需要手动释放?释放的内存方便给白天的推送服务使用。@walker
夜间定时任务代码是已自定义类方法的方式在定时器中调用
workerman内存回收机制完全遵循php原有的GC机制。在workerman里业务代码都是在函数或者类方法里运行的,根据php的回收机制,函数或者类方法里临时变量会自动回收。所以开发时基本不用考虑内存回收问题,也不会有内存泄漏,不需要手动unset。 满足以下条件的变量需要注意: 1、global关键字的全局变量,并且变量是数组(不是数组不用关心) 2、static关键字的类的静态变量,并且变量是数组(不是数组不用关心) 3、给worker对象临时赋值的属性,比如 worker->uidlist,并且这个属性是数组(不是数组不用关心) 以上三种变量是数组的情况下需要注意,这些变量因为不属于临时变量,所以会一直存在于内存,注意不要让数组里面的数据无限增加,否则会导致内存泄漏。 另外定时器也需要注意,定时器也是用一个类的静态数组存储,如果无限增加定时器又从不删除,会导致内存泄漏。
如果我单独new 已Worker类 其中一个子进程只运行一个定时器,一个定时只运行一个计划任务,任务完成后stopAll当前的子进程,这种方式是否可行?
stopAll当前的子进程没看到有什么意思
意思我能不能在一个定时任务完成后重启当前子进程
$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(); }); }; 比如这样的代码
可以
@1:好的万分感谢
夜间定时任务代码是已自定义类方法的方式在定时器中调用
workerman内存回收机制完全遵循php原有的GC机制。在workerman里业务代码都是在函数或者类方法里运行的,根据php的回收机制,函数或者类方法里临时变量会自动回收。所以开发时基本不用考虑内存回收问题,也不会有内存泄漏,不需要手动unset。
满足以下条件的变量需要注意:
1、global关键字的全局变量,并且变量是数组(不是数组不用关心)
2、static关键字的类的静态变量,并且变量是数组(不是数组不用关心)
3、给worker对象临时赋值的属性,比如 worker->uidlist,并且这个属性是数组(不是数组不用关心)
以上三种变量是数组的情况下需要注意,这些变量因为不属于临时变量,所以会一直存在于内存,注意不要让数组里面的数据无限增加,否则会导致内存泄漏。
另外定时器也需要注意,定时器也是用一个类的静态数组存储,如果无限增加定时器又从不删除,会导致内存泄漏。
如果我单独new 已Worker类 其中一个子进程只运行一个定时器,一个定时只运行一个计划任务,任务完成后stopAll当前的子进程,这种方式是否可行?
stopAll当前的子进程没看到有什么意思
意思我能不能在一个定时任务完成后重启当前子进程
$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();
});
};
比如这样的代码
可以
@1:好的万分感谢