当我使用 CakePHP 查找(“全部”)大量数据时,内存不足 [已解决]

这是开发团队的Hase。
之前的文章介绍了如何在 CakePHP 中查找大量数据而不导致内存错误。然而,
我收到了公司内部很多关于那篇文章内容的反馈,所以
这次我想就之前的文章提供一些反馈意见。
所以,如果您能将我之前的文章视为一个新手程序员的胡言乱语,我将不胜感激。
当前代码
$data = $this->Model->find('all'); // 一些处理......
使用 query() 是绝对禁止的。
来自上一篇文章
看起来使用 query() 检索比使用 find('all') 检索更容易处理。
因此,我将其修改为使用 query() 来检索使用 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 循环好得多,因为它避免了不必要的处理。
我学到了新知识!
就是这样。
如果您觉得这篇文章有帮助,请点赞!
3