提问人:morgi tmr dasdas 提问时间:10/19/2023 最后编辑:morgi tmr dasdas 更新时间:10/21/2023 访问量:154
无限循环中的进程队列
process queues in infinite loop
问:
我们有一个在线PHP游戏,需要每秒处理一次任务,我们目前正在通过命令curl -s每分钟运行一个cron作业到我们的某些脚本,以便通过循环一整分钟来每秒处理一些任务,超时60秒。
该方法我们面临 2 个问题:
1-有时查询需要超过1分钟,这会导致数据丢失,因为超时 2- 如果我们删除超时,那么有时我们会遇到高 CPU 问题
它肯定是第二,游戏主要是基于此。
我们目前的代码是:
set_time_limit(65);
for ($i = 0; $i < 59; ++$i){
$this->doThings();
sleep(1);
}
我正在考虑使用 while 而不是 for 来 100% 准确地计算时间,这样更好吗?
任务通常不繁重,我们的 quires 尽可能地优化。
我尝试增加超时限制,并尝试增加 mysql cnf 中的net_write_timeout,这似乎很好地解决了这个问题,但使 cpu 过载问题。
我需要一种正式的方式来每秒处理我们的任务,而不会丢失任何数据或创建过载的 cpu..
##UPDATE
游戏是关于战争之类的东西,当玩家A攻击玩家B时,系统计算出的2个村庄之间会有一段距离,假设是5分钟。
然后它将存储在数据库中,表格 end_time = 现在 + 5 分钟,
所以 $this->doThings() 将从 db 调用应该现在执行的队列 (end_time = now or less ),然后按它们的类型循环它们以进行相应的处理。
我的意思是“接管 1 分钟”我的意思是整个 cron 任务而不是一项任务,对不起解释不好。
当一个 cron 占用 1 分钟以上时,意味着最后一个队列我丢失了,如果我们增加超时,那么就会重叠并导致 CPU 重叠。
##UPDATE 2
这个代码更好吗?
$timelimit = 59; //seconds
set_time_limit($timelimit + 1);
$start_time = time(); //set startup time;
while(((time() - $start_time) < $timelimit) || !$timelimit){
$this->doThings();
}
答: 暂无答案
评论
$this->doThings();