CakePHP错误允许的内存大小耗尽

时间:2011-06-26 09:30:34

标签: php cakephp cakephp-1.3 memory-management

在我的一个PHP应用程序中,我得到允许的内存大小耗尽错误。

我做错了什么错误?

它显示在我使用更多通常的cakephp方法(如'find')的页面上,从索引(列表)页面上的数据库表中选择记录。

我该如何解决?问题是我无法在商业服务器上设置内存大小....

提前谢谢!

5 个答案:

答案 0 :(得分:2)

研究模型的“可包含”行为。这是一个核心行为,听起来你需要将它添加到你的发现中,以限制它们撤回的数据量。此外,开始考虑使用自定义查询替换查找以加快速度并进一步限制返回的数据量。

答案 1 :(得分:1)

正如Stoic建议的那样,你可以增加你的.htaccess文件中的内存限制,但是你应该真正尝试找出它发生的具体原因,因为即使是默认的内存限制也应该足以满足大多数中小型应用的需求。数据库越高,你的内存限制就越高,你就越早升级你的主机方案。

使用Alfred建议的内存检查工具是一种选择,但是如果你的应用程序是合理的基础并且它失败的操作并不复杂,你可以手动在代码中查找告诉标记。首先,您在find周围的任何位置设置递归2吗?如果是,请尝试暂时将其更改为-1。如果没有,您可以在$this->Model->recursive = -1;之前添加find以确保其已设置。

当然,如果你这样做,你的查询可能会失败,但至少你知道吃掉了所有的内存。然后,您可以查看更高效的自定义查询来代替Cake自动查询,这通常可以节省大量开销,尤其是基于多级模型关联的复杂查询。

答案 2 :(得分:1)

还有其他问题可能导致此错误。

例如无限循环,就像我刚无意中实施的那样。

我希望应用程序为每个json调用呈现一个ajax-view,最后我在App控制器中得到了这个结果:

function beforeRender() {

    parent::beforeRender();

     if ($this->params['ext'] == 'json') {

       $this->render('Elements/json');

    }

}

似乎反复回到beforeRender方法。

也许这可以帮助那些经历同样问题的人。

答案 3 :(得分:0)

也许您可以使用xdebug之类的工具检查内存使用情况。接下来,您应该尝试优化该部分(并且只有那部分=>没有过早优化)。

答案 4 :(得分:0)

您可以在.htaccess文件中使用以下内容:

php_value memory_limit 16M

这可以帮助您设置内存限制,而无需摆弄PHP INI文件。 :))
确保这是.htaccess文件中的第一行,通常是..