CodeIgniter3+PHP7.4 API限流实现:循环查询数据库直到忙任务数小于50
实现方案
核心逻辑通过无限循环轮询繁忙任务数实现,满足阈值条件后再执行后续API调用,改造后完整代码如下:
// 脚本开头关闭执行时间限制,避免长时间运行被系统终止 set_time_limit(0); // 加载所有待处理任务 $jobs = $this->db->get('jobs')->result_array(); foreach($jobs as $job) { // 轮询等待繁忙任务数低于50 while (true) { // 修复长时间休眠导致的数据库连接断开问题 $this->db->reconnect(); $busy = $this->db->get_where('jobs', ['status' => 'busy'])->num_rows(); if ($busy < 50) { break; } // 不满足条件等待50秒后重试 sleep(50); } // 先更新当前任务状态为繁忙,避免并发统计误差 $this->db->where('id', $job['id'])->update('jobs', ['status' => 'busy']); // 原有API调用逻辑写在此处 // ----------------------- // API调用完成后更新任务状态为成功/失败 }
注意事项
- 必须在发起API请求前先更新当前任务的
status为busy,否则轮询统计的繁忙任务数会出现偏差,导致实际并发超过服务商的50个限制。 - 若你的任务处理是多进程/多脚本同时运行,建议给
status更新操作加行锁,避免同时抢到同一个任务的情况。 sleep(50)单位为秒,可根据实际业务需要调整等待时长。
内容的提问来源于stack exchange,提问作者Back Office
相关产品推荐
相关产品推荐

