什么导致“无法为池分配内存”在PHP中?

偶尔会遇到服务器的内存分配限制,特别是像WordPress这样的臃肿的应用程序,但从来没有遇到“无法为池分配内存”,并且无法跟踪任何信息。

有谁知道这是什么意思? 我试图增加memory_limit没有成功。 我也没有对申请做任何重大的修改。 有一天没有问题,第二天我遇到了这个错误。

可能是APC相关的。

对于有这个问题的人,请指定你的.ini设置。 特别是你的apc.mmap_file_mask设置。

对于文件支持的mmap,它应该设置为如下所示:

 apc.mmap_file_mask=/tmp/apc.XXXXXX 

要直接从/ dev / zero进行映射,请使用:

 apc.mmap_file_mask=/dev/zero 

对于兼容POSIX的共享内存支持的mmap,请使用:

 apc.mmap_file_mask=/apc.shm.XXXXXX 

使用TTL为0意味着APC将在内存不足时刷新所有caching 。 错误不再出现,但它使得APC效率远远不够。 这是一个没有风险,没有麻烦,“我不想做我的工作”的决定。 APC并不意味着要这样使用。 您应该select足够高的TTL,以便访问最多的页面不会过期。 最好的是提供足够的内存,以便APC不需要刷新caching。

只需阅读手册了解如何使用ttl: http : //www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

解决方法是增加分配给APC的内存。 通过增加apc.shm_size来做到这一点。

如果将APC编译为使用共享段存储器,则您的操作系统将受到限制。 input以下命令查看每个段的系统限制:

 sysctl -a | grep -E "shmall|shmmax" 

要分配更多的内存,你必须增加参数apc.shm_segments段的数量。

如果APC使用mmap内存,那么你没有任何限制。 内存量仍然由相同的选项apc.shm_size定义。

如果服务器上没有足够的内存,那么使用filter选项来防止不经常访问的php文件被caching。

但从不使用0的TTL。

正如c33s所说,使用apc.php来检查你的configuration。 将文件从apc包复制到一个web文件夹,并将浏览器指向它。 你会看到什么是真正的分配,以及如何使用。 如果graphics在每次刷新时完全改变,那么图表必须在几个小时后保持稳定,这意味着您的设置是错误的(APC正在冲洗所有内容)。 分配超过APC真正用作安全保证金的20%RAM,并定期检查。

只允许32MB的默认值是非常低的。 PHP的devise是当服务器是64MB,大多数脚本每页使用一个PHP文件。 如今,像Magento这样的解决scheme需要10K以上的文件(APC约60Mb)。 你应该允许足够的内存,所以大部分的PHP文件总是被caching。 这不是浪费,而是将操作码保存在RAM中,而不是在文件caching中保存相应的原始php。 现在我们可以find24Gb内存的专用服务器,每个月只要80美元,所以不要犹豫,允许几个GB到APC。 我在24GB的服务器上托pipe了5Magento商店和〜40个WordPress网站,APC使用了1.2GB。 Magento安装计数64MB,一些插件的WordPress的40MB。

另外,如果您在同一台服务器上开发了网站。 从caching中排除它们。

为我解决:

  • apc.ttl = 0
  • apc.shm_size =任何你想要的

编辑开始

警告!

@bokan指示我应该在这里加个警告。

如果你有一个0的ttl,这意味着每个caching的项目可以立即清除。 所以如果你有一个小的caching大小像2mb和ttl为0这将使apc无用,因为高速caching中的数据总是被覆盖。

降低ttl只意味着caching不能满,只能使用无法replace的项目。

所以你必须在ttl和caching大小之间select一个好的平衡点。

在我的情况下,我的caching大小为1GB,所以对我来说已经足够了。

编辑结束

在使用php 5.2.17的centos 5上有相同的问题,并注意到如果caching大小很小,并且ttl参数是“高”(如7200),同时有很多php文件要caching,那么caching填充速度相当快而apc没有find任何可以删除的东西,因为caching中的所有文件仍然适合ttl。

增加内存大小只是一个部分解决scheme,如果caching填满并且所有文件都在ttl内,仍然运行此错误。

所以我的解决scheme是将ttl设置为0,所以apc填充caching,总之apc有可能为新数据清除一些内存。

希望有所帮助

编辑:另见: http : //pecl.php.net/bugs/bug.php?id = 16966

下载http://pecl.php.net/get/APC提取并运行apc.php,在那里你有一个很好的图表,你的caching使用情况如何;

运行apc.php脚本是了解你的问题的关键,IMO。 这有助于我们正确调整caching大小,目前似乎已经解决了这个问题。

对于像我这样的新手来说,这些资源有助于:

findapc.ini文件进行上面c33推荐的更改,并设置build议的金额: http : //www.untwistedvortex.com/optimizing-tuning-apc-alternate-php-cache/

了解什么apc.ttl是: http ://www.php.net/manual/en/apc.configuration.php#ini.apc.ttl

了解什么apc.shm_size是: http ://www.php.net/manual/en/apc.configuration.php#ini.apc.shm-size

正如Bokan所说的,如果有可用的话,你可以增加内存,而TTL为0的计数器生产率是正确的。

注意:这是我如何解决我的特定问题的这个错误。 它是一个通用的问题,可以由分配的东西引起的,所以如果你得到的错误,你认为它是由重复的PHP文件被加载到APC造成的,只能按照下面的方式。

我遇到的问题是当我发布我的PHP应用程序的新版本。 即将所有.php文件replace为新的APC将两个版本加载到caching中。

因为我没有足够的内存两个版本的PHP文件APC将耗尽内存。

有一个选项叫apc.stat来告诉APC检查一个特定的文件是否发生了变化,如果是这样,replace它,这对于开发来说通常是可以的,因为你不断地进行更改,但是在生产中它通常是closures的,就像在我的案例 – http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

打开apc.stat会解决这个问题,如果你确定性能命中。

我为我的问题提出的解决scheme是检查是否项目版本已更改,如果这样清空caching并重新加载页面。

 define('PROJECT_VERSION', '0.28'); if(apc_exists('MY_APP_VERSION') ){ if(apc_fetch('MY_APP_VERSION') != PROJECT_VERSION){ apc_clear_cache(); apc_store ('MY_APP_VERSION', PROJECT_VERSION); header('Location: ' . 'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); exit; } }else{ apc_store ('MY_APP_VERSION', PROJECT_VERSION); } 

看着互联网,可能有各种各样的原因。 在我的情况下,一切默认除了…

 apc.shm_size = 64M 

清除了我之前得到的无数警告。

在将OpenCart安装移到其他服务器后,我收到错误“无法为池分配内存”。 我也尝试提高memory_limit。

我改变了错误信息中的文件的权限,以便用户有apache运行的写入权限(apache,www-data等)后,错误就停止了。 我没有直接修改/ etc / group(或将文件chmod到0777),而是使用了usermod:

 usermod -a -G vhost-user-group apache-user 

然后,我不得不重新启动Apache以使更改生效:

 apachectl restart 

要么

 sudo /etc/init.d/httpd restart 

或者无论你的系统使用什么来重新启动Apache。

如果该网站在共享主机上,也许您必须使用FTP程序更改文件权限,或联系主机提供商?

这对我们的家伙(在同一台服务器上运行一个WordPress的网站)工作。

更改了/etc/php.d/apc.ini文件中的内存设置。 它被设置为64M,所以我们把它加倍到128M。

apc.shm_size = 128M

监控你的caching文件的大小(你可以使用apc pecl包中的apc.php)并根据你的需要增加apc.shm_size。

这解决了这个问题。

要解决这个问题,请将apc.shm_size的值设置为整数。find您的apc.ini文件(在我的系统apc.ini文件位置/etc/php5/conf.d/apc.ini中)并设置: apc.shm_size = 1000

在我的系统上,我不得不插入apc.shm_size = 64M到/usr/local/etc/php.ini(FreeBSD 9.1),然后当我看着apc.php(我从/ usr / local / share / doc / APC复制/apc.php到/ usr / local / www / apache24 / data)我发现caching大小已经从默认的32M增加到64M,我不再得到一个大的caching完整计数

参考文献: http : //au1.php.net/manual/en/apc.configuration.php也读了Bokan的评论,他们非常有帮助