如何从查询结果中防止PHP允许的内存大小致命错误?

时间:2011-10-07 11:47:04

标签: php mysql cakephp memory-leaks

我有一个(蛋糕)php函数,用于更新MySQL表中的条目;首先,它运行一个查询以获取自$ lastImportDate以来的所有新项目,然后循环执行对项目的各种操作,保存项目,保存相关的表信息。

不幸的是,在一个特定请求过重的情况下,这似乎正在崩溃。这里有5917(可能还在计数!)条目要更新。该函数循环一段时间,但最终死于“允许的内存大小[大量字节]耗尽”错误。

不强迫任何人通过广泛的代码 - 我可以合理地采用什么策略来尝试阻止此内存泄漏使该表不可更新?

3 个答案:

答案 0 :(得分:1)

听起来就像是在保存变量中的所有记录。尝试只获取ID,然后循环访问ID。您可以通过$ this-> Model-> findById($ id)获取每条记录,并对该特定记录执行操作。然后保存该记录并取消设置数据,这样就不会有太多数据存储在变量中。如果将所有内容放在一个变量中,那么内存耗尽并不会让我感到惊讶。

增加内存限制只是一个不好的临时解决方案,想象一下必须更新100000或更多记录。最终你会用完。

答案 1 :(得分:-1)

您可以随时尝试设置:

ini_set('memory_limit', '-1');

[docs]

more appropriate value

或者,更多地使用SQL(使用CASE更新或嵌套的选择更新),或设置cron job以更小的间隔启动脚本,直到更新完成... < / p>

答案 2 :(得分:-1)

我不确切知道你需要完成的任务的性质。如果您需要定期更新条目:制作蛋糕壳,将其放入cron计划(如果必须,每小时运行一次)。

如果您每次导入数据库时​​都需要执行更新:您可以尝试loop{ get and process 100 records, repeat until done}尝试在达到内存限制之前最大化您可以处理的记录数。