【发布时间】:2012-03-04 12:05:33
【问题描述】:
我正在尝试使用 CakePHP 2.1 的方法 saveMany() 保存超过 10000 条记录的列表。但它给了我一个 500 错误,或者一个“内存耗尽”的致命错误。
如果我在处理完整个数组后对其进行调试(因此,不调用 save 方法),时间在 0.05 秒以下。但是当我添加保存方法($this->saveMany($save, array('validate' => false));)时,它向我显示了上述错误之一。
我提到我在 MySQL 中使用 InnoDB 作为存储引擎,使用 PHP 作为脚本语言。
我做错了什么,我该如何解决?
编辑
我回到这个问题,因为我“解决了”为什么大量记录无法保存。原因是……好吧,甚至一条记录都没有保存。我测试了只保存生成的数组中的第一个元素,这就是它发生的情况:它增加内存直到限制,然后它死了。我已经把它放在我的本地主机上,有 2GB 的内存,它仍然给我超出内存的错误。这很奇怪,我不明白为什么会这样。应用于另一个模型的相同代码按预期工作。我重新创建了模型及其表,但没有成功。我能想到的唯一原因是表名的长度,但这对我来说毫无意义。仅仅为了保存一条记录,什么会导致内存增加?
【问题讨论】:
-
您需要多久执行一次此操作? 10000 条记录从何而来?您需要提供更多信息,以便人们提出替代方法。
-
我正在为我的应用程序构建一个缓存,这样每当我需要检索和计算一些数据时,我只需要从这 10000 条记录中获取几条记录。我只会这样做几个次,手动。所以脚本的唯一要求是实际工作。
-
更新了我的答案。您可以访问 MySQL 控制台吗?
-
这很奇怪。您应该注释掉模型中的所有验证规则,以确保它们不会以任何方式影响。也尝试使用较小的结果集,如 10 行。将 debug 设置为 2 看看 sql dump 是否有什么奇怪的地方。
-
我解决了这个问题。我正在覆盖 Cake 方法并导致无限循环。很傻。感谢您的所有帮助,将您的答案标记为已接受:)
标签: php cakephp innodb save cakephp-2.1