当我使用 CakePHP 查找(“全部”)大量数据时,内存不足 [已解决]
这是开发团队的Hase。
上一篇文章,我写了如何在 CakePHP 中查找(“全部”)大量数据而不导致内存错误,但
了公司内部关于该文章内容的很多批评。有时间我想写一些对之前内容的反馈。
因此,如果您将上一篇文章视为纸质程序员的一个笑话,我将不胜感激。 。 。
当前代码
$data = $this->Model->find('all'); // 一些处理......
使用 query() 是 ×
来自上一篇文章
看起来使用 query() 检索比使用 find('all') 检索更容易处理。
因此,我将其修改为使用 query() 来检索使用 find 检索到的内容。
这是错误的。
首先,查询方法用于执行复杂的查询,
使用时需要对其进行清理和验证,因此最好不要轻易使用它。
首先,使用find更容易有效地使用框架的功能,所以
这次不需要使用查询方法。 。
比使用 for 语句循环
更好
上次,我使用了 for 循环来划分和检索数据。
以前的代码
// 获取数据项数量 $count = $this->Model->find('count'); // 一次获取5000条数据 $limit = 5000; // 循环次数 ({data项目数 ÷ 每次检索的项目数}向上舍入) $loop = ceil($count / $limit); for ($i = 0; $i < $loop; $i++){ // 偏移量 $offset = $ limit * $i; $data = $this->Model->query("select * fromhogehoge as limit {$limit} offset {$offset};", $cachequeries = false); // 一些处理 ... . ……}
这个方法没有什么问题,但是
事实上,我发现使用while语句来获取是一个更好的方法。
使用 while 语句,无需进行计数或计算循环次数。
另外,它是 find('all') 而不是 query()。 。 。
所以我尝试用 while 语句重写它。
重写代码
// 一次检索 5000 个项目的数据 $limit = 5000; $params = array('limit' => $limit, 'offset' => 0); while ($data = $this->Model-> find( 'all', $params)){ // 一些处理 $params['offset']+= $limit }
这肯定比使用 for 语句更好,因为没有不必要的处理。
我学到了很多!
就是这样。
如果您觉得这篇文章有帮助,请点赞!