当前的设计是这样的:在workerman-chat的Event::onWorkerStart中设置一个定时器,定时去获取各个订单的运单状态(根据快递公司的API来获取)。如果运单状态有更新则直接当作聊天记录发送给用户和商家(项目与gateway通信这个已经修好,再次感谢walkor)。
gateway手册上说“不要在onWorkerStart内执行长时间阻塞或者耗时的操作”。
示例代码如下:
public static function onWorkerStart(){
// 每1小时执行一次
$time_interval = 3600;
Timer::add($time_interval, 'check_express', array(), false);
}
请问,check_express()是一比较耗时的操作,像上面的设计会有阻塞影响么?
定时器影响不大,GatewayWorker中onWorkerStart不允许有长时间阻塞操作是为了让businessWorker与Gateway之间能快速链接,只有businessWorker与Gateway之间建立起通讯链接,整个系统才能使用。否则会有
SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready
错误不过即使定时器不影响businessWorker与Gateway之间建立起通讯链接,由于定时器的任务正在执行时当前进程无法处理其它业务请求,如果任务执行时间很长,会导致这个进程的请求排队等待。
我可不可以这样理解,因为onWorkerStart只在启动时执行一次。在onWorkerStart里设置定时器只是为了触发定时启动而已,并且系统启动时还没有达到执行业务时间。那么只要在定时间隔内(这里是一个小时,我觉得这个任务应该是几秒内就能完成)完成了check_express()里的业务就不会对整个聊天系统有影响?
可以这么理解