centos
workerman 3.0 版
照着手册的定时任务例子做了,没有任何输出。
use \Workerman\Worker;
$task = new Worker();
// 开启多少个进程运行定时任务,注意多进程并发问题
$task->count = 1;
$task->onWorkerStart = function($task)
{
$time_interval = 2;
\Workerman\Lib\Timer::add($time_interval, function()
{
echo "task run\n";
});
};
这样做倒是有输出。
\Workerman\Lib\Timer::add(1,function(){echo "task run\n";});
所以我想,是不是进程的问题
$task = new Worker();
那么这个是需要扩展支持还是?
我看了php -m
pcntl这个是有的
代码按照手册规范要放在Applications/项目/start.php中,不知道killhook放在哪里运行的。
例如新建文件Applications/Test/start.php
这样表示要建立了一个Worker进程,Worker进程在启动的时候建立了一个定时任务,2秒运行一次,输出 “task run\n”
在workerman根目录运行 php start.php start 运行查看结果
首先很感谢你的耐心回答
问题确实如你所说,若要建立一个进程的话,这份代码必须放在项目的start.php文件中。
我的是放在自己建立的文件里了,所以不能新建进程,只能添加一个定时任务于当前进程。
另外还有一个问题想请教,我希望在start.php文件里添加一个定时任务,定时执行我自己建立的一个文件里的类里的函数。
但引入路径无论怎么写,都说致命错误,找不到类。
该文件路径为 Applications/项目/MyFunction/TictakEvent.php
TictakEvent.php的代码为
use \Workerman\Worker; 这个已经引入了,我怕我描述的不够详细。
详细错误是说找不到这个类 \MyFunction\TictakEvent
可以更新下workerman
之前Worker没有实现业务类的自动加载,Gateway/Worker是有自动加载的
现在都加上了自动加载,可以试下
可以了,非常感谢
你好,之后又产生了新的问题。
已经可以在项目start文件里添加新进程定时运行我自己建立的文件了
在我自己的文件函数里,有用到
Gateway::sendToAll('{"message":"hehe","type":"test"}',$user_list);
但使用时报错
$user_list 我var_dump出来是有值的。
但不知为何,传入sendToAll后,我在Gateway文件里加入了var_dump的语句来检查我传入的数组,结果却是
bool(false)
我可以确认,我的数组里的用户是在线的。
我这测试没有问题,这里是start.php的全部代码
你可以自己var_dump定位下是哪里的问题,问题应该很好找
你的代码我测试下来是没有问题的
我的代码放到项目/Event.php里于当前进程执行也是没有问题的
但是一旦放在我自己新建的文件里,问题就出来了。
经过跟踪调试发现,在\GatewayWorker\Lib\Gateway.php 文件的第42行起
如果是在项目的start.php文件里做的新建进程或者是在项目的Event.php里做的添加至当前进程,
在执行sendToAll时,self::$businessWorker为真,执行if里的语句
而如果是在项目start.php里新建进程去定时调用我自己建立的文件里的函数。
这个函数在执行sendToAll时,self::$businessWorker为假,执行的是else里的语句。
我想这就是问题所在吧。。
这种情况是因为一个项目是基于Gateway/Worker的,另外一个项目是基于Worker的,Workerman/Applications下的多个项目是不相干的,Worker项目里面找不到Gateway/Worker的配置导致
解决办法:
可以手动require_once下Gateway/Worker项目下的Config/Store.php试下
经过尝试在项目里包含配置文件,这没有解决问题。
先把代码放start.php里跑起来再说吧。暂时不想折腾这个问题了。。。。
非常感谢你的耐心回答。
walkor,我郑重的向你道歉,我始终还是咽不下定时进程这口气,盯着你的源码看了良久,又在脑海里把Gateway/Worker 的进程模型翻来覆去的想。终于明白。都是我的错,为了便于调试,我在我自己的业务处理类里的客户登陆那加入了以下代码。
$store = Store::instance('room');
$store->flush();
这样,你的Gateway.php又哪里能取到值。。。。。
$all_addresses = Store::instance('gateway')->get('GLOBAL_GATEWAY_ADDRESS');
非常抱歉。以及感谢你的耐心和专业。
现在代码已经在愉快的正常工作了。
好的