由于GatewayWorker/Applications/YourApp/start_businessworker.php
里设置的进程数量是4
$worker->count = 4;
在Events.php
文件的onWorkerStart
事件里设置了一个定时器。
public static function onWorkerStart($businessWorker){
// 每N秒执行一次
$time_interval = 60;
Timer::add($time_interval, function () {
echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 分钟定时器' . "\n";
# 进行同步或者异步的数据库写入操作
});
}
重启服务后,会连续打印4条数据。说明定时器执行了4次。
[10-06 18:27:15] onWorkerStart 分钟定时器
[10-06 18:27:15] onWorkerStart 分钟定时器
[10-06 18:27:15] onWorkerStart 分钟定时器
[10-06 18:27:15] onWorkerStart 分钟定时器
要在定时器内执行异步的数据库写入操作,如何让多进程下,只有一个全局定时器呢?
在Event::onWorkerStart
里设置了mysql和Redis数据库的初始化配置。
如果有4个businessworker
进程,这里就会初始化4次。
重复的配置和初始化,会不会造成资源浪费呢?
能不能只初始化一次,全局所有的onMessage
事件里就可以用呢。
找到一个解决的办法,仅供参考。如果有更好的办法,欢迎提出来。
先在
Events.php
里创建一个测试函数然后在
start_worker.php
的onWorkerStart
里创建一个定时器,调用Events.php
里的测试方法实测这个定时器是单进程的,每分钟会执行一次。而不是每分钟连续执行4次
然而、但是,上面这个简单的例子是可以执行的。
写了个复杂点的,在定时器里执行Redis写入操作,就报错了:
看来这个方法还是不能做数据库操作啊。期待更好的办法。
试试这样
确实可用。感谢大佬