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

我偶尔会遇到服务器的内存分配限制,特别是像 Wordpress 这样臃肿的应用程序,但从未遇到过“无法为池分配内存”的情况,也从未遇到过跟踪任何信息的困难。

有人知道这意味着什么吗?我试过增加血氧饱和度,但没成功。我也没有对应用程序做任何重大更改。前一天还没有问题,第二天我就碰到了这个错误。

172462 次浏览

可能跟装甲运兵车有关。

对于有此问题的用户,请指定您的. ini 设置。

对于文件支持的 mmap,应该将其设置为:

apc.mmap_file_mask=/tmp/apc.XXXXXX

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

apc.mmap_file_mask=/dev/zero

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

apc.mmap_file_mask=/apc.shm.XXXXXX

我的解决办法是:

  • Apc.ttl = 0
  • Shm _ size = 任何你想要的

编辑开始

警告!

@ Bokan 让我在这里加个警告。

如果 ttl 为0,则意味着可以立即清除所有缓存的项。因此,如果缓存大小很小,比如2mb 和 ttl 为0,那么 apc 就会失效,因为缓存中的数据总是会被覆盖。

降低 ttl 只意味着缓存不能满,只有无法替换的项才能满。

因此您必须在 ttl 和缓存大小之间选择一个很好的平衡。

在我的情况下,我有一个1GB 的缓存大小,所以它对我来说已经足够了。

剪辑结束

有同样的问题,在分解5与 php 5.2.17,并注意到,如果 缓存大小很小,ttl 参数是“ high”(比如7200) ,而 有大量的 php 文件要缓存,那么缓存填充得很快 而 apc 找不到任何可以删除的内容,因为 缓存仍然适合 ttl。

增加内存大小只是部分解决方案,您仍然运行在 如果缓存填满并且所有文件都在 ttl 中,则会出现此错误。

所以我的解决方案是将 ttl 设置为0,这样 apc 就可以填充缓存 APC 总是有可能为新的内存清除一些内存 资料。

希望能帮上忙

编辑: 另请参阅: < a href = “ http://pecl.php.net/bug/bug.php? id = 16966”rel = “ nofollow”> http://pecl.php.net/bugs/bug.php?id=16966

下载 http://pecl.php.net/get/APC提取文件并运行 apc.php,这里就有了一个很好的缓存使用情况示意图

运行 apc.php 脚本是理解问题所在的关键,IMO。这有助于我们正确地调整缓存的大小,目前看来,似乎已经解决了这个问题。

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

查找 apc.ini 文件以进行上面 c33s 建议的更改,并设置建议的数量: 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

看看互联网,可以有各种各样的原因。 对我来说,除了..。

apc.shm_size = 64M

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

使用0的 TTL 意味着 APC 在内存耗尽时将刷新 所有的宝藏。错误不再出现,但它使 APC 的效率低得多。这是一个没有风险,没有麻烦,“我不想做我的工作”的决定。装甲运兵车不应该这样使用。您应该选择一个足够高的 TTL,这样访问次数最多的页面就不会过期。最好的办法是提供足够的内存,这样 APC 就不需要刷新缓存。

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

解决方案是增加分配给 APC 的内存。 通过增加 apc.shm _ size.

来实现这一点

如果 APC 被编译成使用共享段内存,那么您将受到操作系统的限制。键入以下命令查看每个段的系统限制:

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

为了分配更多的内存,您必须使用参数 apc.shm _  增加段的数量。

如果 APC 使用 mmap 内存,那么就没有限制。内存量仍然由相同的选项 apc.shm _ size 定义。

如果服务器上没有足够的内存,那么使用过滤器选项来防止缓存访问频率较低的 php 文件。

但千万不要使用0的 TTL。

正如 c33所说,使用 apc.php 检查您的配置。将文件从 apc 包复制到一个网络文件夹,并将浏览器指向该文件夹。您将看到实际分配了什么以及如何使用它。图表必须在数小时后保持稳定,如果它们在每次刷新时都完全改变,那么这意味着您的设置是错误的(APC 正在刷新所有内容)。分配20% 以上的内存比什么 APC 真正使用作为一个安全边际,并定期检查它。

默认情况下只允许32MB 的大小低得离谱。PHP 的设计时,服务器是64 MB,大多数脚本使用每页一个 PHP 文件。现在像 Magento 这样的解决方案需要10k 以上的文件(APC 中大约60Mb)。您应该允许足够的内存,这样大多数 php 文件总是被缓存。这并不是浪费,将操作码保存在 ram 中比在文件缓存中保存相应的原始 php 更有效。 现在,我们可以找到专用服务器与24GB 的内存低至80美元/月,所以不要犹豫,允许几 GB 的 APC。我把24GB 中的2GB 放在一个托管5Magento 商店和 ~ 40 wordpress 网站的服务器上,APC 使用1.2 GB。Magento 安装需要64MB,Wordpress 和一些插件需要40MB。

另外,如果您在同一个服务器上有开发网站,请将它们从缓存中排除。

正如 Bokan 所提到的,如果可用的话,您可以增加内存,并且他正确地指出了将 TTL 设置为0会产生多大的反作用。

注意: 这就是我如何为我的特殊问题修复这个错误的。这是一个通用的问题,可以造成的分配的事情,所以只有遵循下面的,如果你得到的错误,你认为它是由重复的 PHP 文件被加载到 APC 造成的。

我遇到的问题是当我发布 PHP 应用程序的新版本时。我替换了我所有的。使用新的 php 文件,APC 会将两个版本都加载到缓存中。

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

有一个名为 APC.stat 的选项可以告诉 APC 检查某个特定文件是否发生了更改,如果发生了更改,则替换它,这对于开发来说通常是可以的,因为您不断地进行更改,但是在生产中,它通常是关闭的,就像我的情况一样—— http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

打开 apc.stat 可以修复这个问题,如果性能没有问题的话。

对于这个问题,我想到的解决方案是检查项目版本是否已经更改,如果已经更改,则清空缓存并重新加载页面。

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);
}

在将 OpenCart 安装移动到另一台服务器后,我收到了错误“无法为 pool 分配内存”。我还尝试提高 memory _ limit。

当我更改了错误消息中文件的权限,使得 apache 作为(apache、 www-data 等)运行的用户具有写访问权限后,错误停止了。我没有直接修改/etc/group (或者将文件修改为0777) ,而是使用 usermod:

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

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

apachectl restart

或者

sudo /etc/init.d/httpd restart

或者任何你的系统用来重启 Apache 的东西。

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

监视缓存文件的大小(可以使用 apc pecl 包中的 apc.php)并增加 根据需要调整 apc.shm _ size。

这样问题就解决了。

要解决此问题,请将 apc.shm _ size 的值设置为整数 找到您的 apc.ini 文件(在我的系统 apc.ini 文件位置/etc/php5/conc.d/apc.ini)并设置: Shm _ size = 1000

这对我们的人来说很有用(在同一台服务器上运行大量的 WordPress 站点)。

在/etc/php.d/apc.ini 文件中更改了内存设置。

Shm _ size = 128M

我不得不在我的系统里 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) 我发现缓存大小已经从默认的32M 增加到64M,我不再得到一个大的缓存完整计数

参考文献: Http://au1.php.net/manual/en/apc.configuration.php 也看了博坎的评论,很有帮助