请问怎么定时每天9:00执行指定任务 ?
我需要每天9:00执行一些操作,然后重启worker子进程
$worker->onWorkerStart = function($worker) { Timer::add(1, function(){ if('09:00:00' == date('H:i:s')) { //这里写业务逻辑 Worker::stopAll(); } }, [], true); };
要是错过了09:00:00怎么办,比如有任务阻塞了直到09:00:05才反应过来?
那就把阻塞的任务抽出来变成异步非阻塞的来搞
另外你还可以使用crontab精准控制定时器,然后在指定的时间发送事件到worker进程(开个业务端口)来处理。
每秒做一次判断,显然消耗太大了,最小精确到分钟即可。另外建议做法是计算出下个9点相差的秒数,设一个这个秒数的定时器即可,几乎无消耗。如果怕错过9点,那肯定要通过一定的逻辑,保存要执行的任务列表,或者使用延迟消息队列。
用Java的elastic_job 用workerman的定时器, 用系统的crontab, 用环形队列自己实现, 用redis的消息失效订阅通知 都可以实现,看你的业务,怕错过可以跑异步任务
像上面的代码,可以定义个时间范围,,然后在那个范围查询数据库有没有执行记录,没有就执行下去,然后添加执行记录,我就是一直这样写的
要是错过了09:00:00怎么办,比如有任务阻塞了直到09:00:05才反应过来?
那就把阻塞的任务抽出来变成异步非阻塞的来搞
另外你还可以使用crontab精准控制定时器,然后在指定的时间发送事件到worker进程(开个业务端口)来处理。
每秒做一次判断,显然消耗太大了,最小精确到分钟即可。另外建议做法是计算出下个9点相差的秒数,设一个这个秒数的定时器即可,几乎无消耗。如果怕错过9点,那肯定要通过一定的逻辑,保存要执行的任务列表,或者使用延迟消息队列。
用Java的elastic_job
用workerman的定时器,
用系统的crontab,
用环形队列自己实现,
用redis的消息失效订阅通知
都可以实现,看你的业务,怕错过可以跑异步任务
像上面的代码,可以定义个时间范围,,然后在那个范围查询数据库有没有执行记录,没有就执行下去,然后添加执行记录,我就是一直这样写的