Zend php memory memory_limit

时间:2010-03-05 01:33:43

标签: php zend-framework memory

全部,

我正在开发基于Zend Framework的Web应用程序。我们的开发服务器上遇到内存不足错误:

允许的内存大小为XXXX字节耗尽(尝试YYYY ...

我们继续在php.ini中增加memory_limit,但它现在已超过1000兆。什么是正常的memory_limit值? php / Zend中常见的内存耗尽是什么?我们正在使用Propel ORM。

感谢您的帮助!

更新 我无法在Windows环境中重现此错误。如果我将memory_limit设置为低(比如16M),我会得到相同的错误,但“试图分配”的数量总是合理的。例如: (试图分配13344字节) 如果我在(Fedora 9)服务器上设置内存非常低(例如16M),我会得到同样的东西。一致,合理的内存不足错误。但是,即使我们的服务器(例如128M)上的内存限制设置得非常高,也许每周一次,我会得到一个疯狂的巨大内存错误:(试图分配1846026201字节)。我不知道这是否会对正在发生的事情有所了解。我们正在使用propel 1.5。这听起来好像是本月晚些时候发布的实际版本,但看起来并不像其他任何人都有这个问题。我不知道Propel是问题所在。我们在Linux机器上使用Zend Server和php 5.2,在本地使用5.3。

还有什么想法吗?我有一张票可以在Linux机器上安装Xdebug。

谢谢,

-rep

4 个答案:

答案 0 :(得分:5)

一般来说,对于PHP 5.2和/或PHP 5.3,我倾向于认为32M memory_limit超过16M是“太多”:

  • 使用Frameworks / ORM和类似的东西,32M通常是不够的
  • 使用64M通常足以支持我正在处理(典型网站)的网络应用
  • 使用超过memory_limit意味着服务器将无法处理尽可能多的用户。


当涉及到达file的脚本时,通常的问题是尝试将太多数据加载到内存中;几个例子:

  • 使用file_get_contents或{{1}}等函数或与XML相关的函数/类加载内存中的大文件
  • 创建过多的数据
  • 创建太多对象

考虑到您使用的是ORM,您可能会遇到以下情况:

  • 您正在执行一些返回大量行的SQL查询
  • 您的ORM正在转换对象中的每一行,将这些行转换为数组
  • 在这种情况下,解决方案是加载更少的数据
    • 使用分页,例如
    • 或尝试将数据加载为数组而不是对象(我不知道这是否可以使用Propel - 但它与Doctrine有关;所以也许Propel也有办法做到这一点?)

答案 1 :(得分:0)

您的应用程序在内存不足时究竟做了什么。这可能有很多原因。我会说最常见的是为数组分配太多数据。您的应用程序是否按照这些方式执行任何操作。

答案 2 :(得分:0)

你发生了两件事中的一件,也许两件事:

  1. 你应该在某个地方失去一个失控的过程。
  2. 您拥有可以抛出大量数据的算法,例如巨大的字符串或数组或对象,并且正在制作不必要的副本,而不是只处理他们需要的内容并丢弃他们不需要的内容。

答案 3 :(得分:0)

我认为这与巡航控制部署有关。当有人部署新代码时(或者只是在部署新代码之后),我只获得非常高(按演出的顺序)内存错误。这也有点意义,因为错误总是指向一行“require_once”。每次我收到错误: 致命错误:第2行的/directory/file.php内存不足(分配4456448)(试图分配3949907977字节)

我已将“require_once”行替换为: class_exists('Ingrain_Security_Auth')||要求( '阿利/安全性/ Auth.php');

到目前为止,我已在3个文件中替换了该行,并且没有任何内存问题。任何人都可以了解可能发生的事情吗?我正在使用Cruise Control进行部署。