PHP在线游戏每秒任务调度问题优化咨询
在线PHP游戏每秒任务处理的性能与可靠性问题
当前实现方式
- 通过每分钟执行cron job,使用
curl -s调用处理脚本 - 脚本内通过for循环执行59次任务,每次执行
$this->doThings()后调用sleep(1),设置set_time_limit(65)避免提前超时
现有核心代码:
set_time_limit(65); for ($i = 0; $i < 59; ++$i){ $this->doThings(); sleep(1); }
现存问题
- 任务超时丢数据:部分场景下整个cron任务耗时超过1分钟,触发超时后导致最后一批队列任务丢失
- CPU过载:取消超时限制后,出现任务重叠引发的CPU过载问题
业务背景补充
这是一款战争类游戏,核心任务逻辑:
- 玩家发起攻击时,系统计算两地距离(例如5分钟),将任务存入数据库并设置
end_time为当前时间+预计耗时 $this->doThings()负责查询所有end_time ≤ 当前时间的待处理任务,按类型执行处理逻辑- 此前的超时问题是指cron任务整体超时,导致未完成的最后一批任务丢失;延长超时后,前后两次cron任务的处理逻辑重叠,引发CPU过载
待评估的优化代码
以下代码是否能解决现有问题?
$timelimit = 59; //seconds set_time_limit($timelimit + 1); $start_time = time(); //set startup time; while(((time() - $start_time) < $timelimit) || !$timelimit){ $this->doThings(); }
需求目标
寻求高效实现方案,满足:
- 每秒精准执行任务处理
- 不丢失任何任务数据
- 不会引发CPU过载
内容的提问来源于stack exchange,提问作者morgi tmr dasdas
相关产品推荐
相关产品推荐

