Codeigniter 服务器超时 - 在 for 循环中运行批量数据库查询
Posted
技术标签:
【中文标题】Codeigniter 服务器超时 - 在 for 循环中运行批量数据库查询【英文标题】:Codeigniter Server timeout - Running bulk DB queries inside for loop 【发布时间】:2021-09-12 09:17:48 【问题描述】:我在 foreach 循环中编写了一个数据库查询,在某些情况下,该查询使用不同的参数执行了 100 多次。
当 foreach 循环仅重复几轮时,脚本运行良好。
除了重新安排查询以在单个请求中获取所有数据之外,还有其他替代方法可以让我以有效的方式使用 foreach 循环运行脚本吗?
我当前的脚本
// some where clauses here
$re = $this->db->get('cash_collection')->result();
$d=0;
foreach($re as $area) // this loop runs 100+ rounds
// call a function with single db query
$re[$d]->area_paid = $this->Payment_m->get_inTotalForNormal($area->fka_id,$area->in_date);
$d++;
return $re;
【问题讨论】:
【参考方案1】:据我了解您的需求,我认为您需要将“result()”替换为“unbuffered_row()”。 result() 将立即将整个结果加载到内存中,而unbuffered_row() 方法返回单个结果行而不将整个结果预取到内存中。你可以了解更多here。
示例代码
// some where clauses here
$re = $this->db->get('cash_collection');
$d=0;
while ($area = $query->unbuffered_row()) // this loop runs 100+ rounds
// call a function with single db query
$re[$d]->area_paid = $this->Payment_m->get_inTotalForNormal($area->fka_id,$area->in_date);
$d++;
return $re;
现在您的脚本应该能够处理大型结果集了。
注意 CI4 是 getUnbufferedRow()。
【讨论】:
感谢 mail2bapi 的回复。就我而言,您的解决方案不起作用。相反,我使用 get_compiled_select();将查询合并在一起的方法,它将时间从 78 秒缩短到 3 秒以上是关于Codeigniter 服务器超时 - 在 for 循环中运行批量数据库查询的主要内容,如果未能解决你的问题,请参考以下文章
错误超时,在 codeigniter 中使用 excel_reader 上传 excel 文件
在 Codeigniter 3 中通过 Office365 帐户发送电子邮件 - 连接超时
Codeigniter:太多的 ajax 调用导致 Web 应用程序超时
mysql_query("START TRANSACTION")- 超过锁定等待超时;尝试在 Codeigniter Mysql 中重新启动事务