使用apache的另一个PHP内存不足问题


Another PHP out of memory problem using apache

我知道这是一个老问题!但这次我有不同的情况。

我在OpenSuse上运行php/mysql/apache。我已经设置php与128MB的内存。我没有apache的RLimitMEM

一切都很好,鸟儿歌唱,鲜花盛开,但一旦我重新启动我的apache,不好的事情发生了!

得到PHP Fatal error: out of memory blah blah。所有运行良好的php应用程序现在都记录了这个错误。发生了什么事?我试了memory_limit = 512M,没有任何进展。

我很困惑为什么我所有的php文件现在抛出这个错误,除了非常小的脚本。我尝试了phpinfo(),我真的有128MB的内存。(我知道php apache ini设置不同于独立的php,我配置了正确的一个!).

更新:

精确PHP错误示例:

[Mon Jul 25 04:22:25 2011] [error] [client 31.57.122.252] PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 491520 bytes) in /srv/www/htdocs/phpMyAdmin/libraries/common.inc.php on line 796

[Mon Jul 25 04:26:39 2011] [error] [client 31.57.122.252] PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 4 bytes) in /srv/sbuta/library/Zend/Config/Ini.php on line 172

[Mon Jul 25 04:27:02 2011] [error] [client 31.57.122.252] PHP Fatal error: Out of memory (allocated 1048576) (tried to allocate 30720 bytes) in /srv/kode/library/Zend/Config/Ini.php on line 132

问题是没有剩余的物理内存!禁用一些PHP或apache模块应该可以解决这个问题。

分步指南(:D):

    查看是否为php分配了足够的内存。通常在/etc/php5/apache2/php.ini搜索memory_limit = ...。(为了测试它,尝试在您的服务器中放置一个具有某些奇怪名称的文件,其内容为:<?php echo phpinfo();?>,并查看memory_limit值)。测试你的apache设置中是否有RLimitMEM。您可以使用cd /etc/apache2/ && grep -irn 'RLimitMEM'查找。
  • 查看/etc/security/limits.conf
  • 中是否对wwwrun(或apache正在运行的任何用户)有任何安全限制
  • 尝试从php和/或apache中排除一些不必要的模块。

记住在任何更改后重新启动apache以测试它

内存不足错误是由于脚本在内存中存储了太多数据的结果。如果你有一个大数据集的数据库,并且使用fetchAll()而不是过滤来提取数据,你可能很快就会耗尽内存。另一个问题是存储如此大数据集的对象。最后但并非最不重要的是,您可能有一个循环,将数据添加到内存中,直到达到限制。

检查脚本中需要提取数据和使用XDebug的地方。它可以显示内存使用的增加情况。


奇怪。"内存不足"的错误,你这里不是你通常得到的错误与php memory_limit配置(有"内存耗尽"),因为你有它与所有的应用程序,这是更清楚的。

似乎有一个限制强加的服务器环境,在你的情况下是Apache。也许您可以/必须在配置文件中使用RLimitMEM设置max限制。默认是使用操作系统默认值,即OpenSuse。如果你突然对运行Apache模块的用户有限制,这可能会到你的Apache环境,然后一直到你的PHP脚本,最后抱怨。

2日更新
是时候隔离问题了。因为当你重启服务器时它就开始了你所有的应用都遇到了这个问题这肯定是服务器环境中的问题。尝试用默认的Apache配置启动和运行phpMyAdmin。如果这已经导致错误,你必须检查你的linux服务器

PHP在每次加载时重新启动脚本;除非您的脚本全天候运行,否则它不会受到Apache持续正常运行时间的影响。当Apache的内存使用增长时,它要么有更多的PHP进程,要么就像Apache和PHP一样开始泄漏内存。

假设您有一个包含"foo"的100000000个元素的数组,并且您将它们传递给另一个函数,该函数调用复制该数组,有效地使PHP内存使用翻倍。如果这样调用很少,就很容易出现脚本内存不足的情况。

我在一台服务器上遇到了这个问题,结果发现这是Gnome3桌面环境的问题。在Debian和Ubuntu服务器上,如果你安装了Gnome3或Unity桌面环境,它会消耗太多的桌面内存,开始使用apache需要的RAM,从而导致内存不足错误。

通过安装"Gnome-Classic",Mate或LXDE桌面环境并登录到该环境来解决问题。