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
加载中...
3票,平均分:1.00/13
5,023
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

长谷达也

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

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

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

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