当我使用 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
加载中...
3 票,平均:1.00 / 13
4,943
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

长谷达也

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

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

我们还为 Shopify 开发私人/自定义应用程序。

原本在大阪事务所工作,2019年调到横滨事务所。
我的爱好是棒球/卡拉OK/动漫