CakePHP 在对大量数据使用 find('all') 后内存不足 [已解决]

这是开发团队的 Hase。
之前的文章介绍了如何在 CakePHP 中查找(“所有”)大量数据而不导致内存错误。然而,我
收到了公司内部对那篇文章内容的各种反馈,所以
这次我将根据这些反馈来撰写这篇文章。
所以,如果您能将我之前的文章视为一个新手程序员的胡言乱语,我将不胜感激。
当前代码
$data = $this->Model->find('all'); // 执行某些操作 .........
使用 query() 是绝对禁止的。
来自上一篇文章
看来使用 query() 函数检索数据比使用 find('all') 函数检索数据更轻量级。
因此,我修改了代码,用 query() 函数代替 find 函数来检索数据。
这是不正确的。
`query` 方法用于执行复杂的查询,
使用它需要进行数据清理和验证,因此通常最好不要随意使用。
事实上,使用 `find` 方法更简单高效,能够更好地利用框架的功能,因此
在这种情况下完全没有必要使用 `query` 方法。
比使用 for 语句
更好
上次,我们使用 for 循环来分割和检索数据。
之前的代码
// 获取数据项的数量 $count = $this->Model->find('count'); // 一次检索 5000 条数据 $limit = 5000; // 循环次数({数据项总数 ÷ 一次检索的数据项总数} 向上取整) $loop = ceil($count / $limit); for ($i = 0; $i < $loop; $i++){ // 偏移量 $offset = $limit * $i; $data = $this->Model->query("select * from hogehoge 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
