在GatewayWorker的onWorkerStart方法中,调用了Crontab模块。
gateway进程数设置为4,经过测试,发现每次执行都会出现4个结果。
有什么办法能让Crontab模块只执行1次,而不是执行多次呢?
使用$pid = posix_getpid()
方法,获取到的是5位数的id,数字是随机的,并不固定。
有什么办法能获得$pid映射的$worker_id,结果如0、1、2、3这样的呢?
//GatewayWorker/Applications/YourApp/Events.php
use Workerman\Crontab\Crontab;
public static function onWorkerStart($businessWorker)
{
// 每分钟的第1秒执行.
self::$crontab = new Crontab('1 * * * * *', function () {
// echo date('Y-m-d H:i:s') . "\n";
echo posix_getpid() . "\n";
});
}
输出内容:
13080
13091
13093
13094
还有一个问题,就是打印$businessWorker
这个参数,输出的是null。这个是什么原因呢?
测试了一下,设置$worker->count = 1;
就可以实现Crontab模块只执行1次。
不知道还有没有其他更好的办法?
通过查询开发手册和论坛搜索,目前已找到另外两种办法。
1、在start_gateway.php所在目录里建立一个start_worker.php,内容类似
以上内容来自https://www.workerman.net/q/8853
2、添加一个回调函数:
也可以这样Event.php里
这样会报错的。
Deprecated: call_user_func() expects parameter 1 to be a valid callback, non-static method Events::onWorkerStart() should not be called statically in /www/wwwroot/api.xxx.cn/GatewayWorker/vendor/workerman/gateway-worker/src/BusinessWorker.php on line 214
public static function onWorkerStart($worker)
对啊,我是这样实现的。文件路径是“GatewayWorker/Applications/YourApp/Events.php”,在Events类下,public static function onWorkerStart($businessWorker),无法打印$businessWorker
检查下加没加 static
直接复制您上面的代码,放在Events类里。启动服务后,会拼命地打印“ Gateway: Worker->name conflict. Key:127.0.0.1:YourAppBusinessWorker:0”
如果启动多组BusinessWorker,BusinessWorker->name不能一样