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

这是开发团队的 Hase。

之前的文章介绍了如何在 CakePHP 中查找大量数据而不导致内存错误。然而,
我收到了公司内部很多关于那篇文章内容的反馈,所以
这次我想就之前的文章提供一些反馈意见。

所以,如果您能将我之前的文章视为一个新手程序员的胡言乱语,我将不胜感激。

当前代码

$data = $this->Model->find('all'); // 执行某些操作 .........

使用 query() 是绝对禁止的。

来自上一篇文章

看起来 query() 比 find('all') 更快。
所以我把之前用 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
加载中...
3票,平均分:1.00/13
4,968
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

长谷达也

应届毕业生加入 Beyond Co., Ltd.。

我们开发网络系统(开发基于浏览器的服务和系统,例如网络服务、数字内容和业务管理系统)和游戏 API(开发用于与应用程序游戏通信的程序)。

我们也为 Shopify 开发私有/定制应用程序。

他最初在大阪办公室工作,2019年被调到横滨办公室。
他的爱好是棒球、卡拉OK和动漫。