原因是什么;无法为池“分配内存”;在PHP中?

原因是什么;无法为池“分配内存”;在PHP中?,php,caching,memory,apc,Php,Caching,Memory,Apc,我偶尔会遇到服务器的内存分配限制,特别是像Wordpress这样臃肿的应用程序,但从未遇到“无法为池分配内存”和跟踪任何信息的问题 有人知道这是什么意思吗?我尝试增加内存限制,但没有成功。我还没有对应用程序进行任何重大更改。前一天没有问题,第二天我遇到了这个错误。 对于有此问题的用户,请指定您的.ini设置。特别是您的apc.mmap_文件_掩码设置 对于文件支持的mmap,应将其设置为: apc.mmap_file_mask=/tmp/apc.XXXXXX 要直接从/dev/zero映射mm

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

有人知道这是什么意思吗?我尝试增加
内存限制
,但没有成功。我还没有对应用程序进行任何重大更改。前一天没有问题,第二天我遇到了这个错误。

对于有此问题的用户,请指定您的.ini设置。特别是您的apc.mmap_文件_掩码设置

对于文件支持的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
  • apc.shm_size=您想要的任何东西
编辑开始

警告 @博坎告诉我,我应该在这里添加一个警告

如果ttl为0,则表示可以立即清除每个缓存项。因此,如果缓存大小很小,如2mb,ttl为0,则apc将变得无用,因为缓存中的数据总是被覆盖

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

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

在我的例子中,缓存大小为1gb,所以对我来说已经足够了

编辑结束

在centos 5和PHP5.2.17上也有同样的问题,并注意到 缓存大小很小,ttl参数为“高”(如7200),而 有很多php文件要缓存,那么缓存会很快填满 apc找不到任何可以删除的内容,因为所有文件都在 缓存仍然适合ttl

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

因此,我的解决方案是将ttl设置为0,这样apc将填充缓存 apc总是有可能清除一些新内存 数据

希望有帮助

编辑: 另见:


下载摘录并运行apc.php,这里有一个很好的缓存使用情况图表,运行apc.php脚本是理解问题的关键,IMO。这有助于我们正确调整缓存大小,目前似乎已经解决了问题。

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

查找apc.ini文件以进行上述C33建议的更改,并设置建议量:

了解什么是apc.ttl:

了解apc.shm_的大小:

看看互联网,可能有多种原因。 在我的情况下,除了

apc.shm_size = 64M

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

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

只需阅读手册即可了解ttl的使用方法:

解决方案是增加分配给APC的内存。 通过增加apc.shm_大小来实现这一点。

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

sysctl -a | grep -E "shmall|shmmax"
要分配更多内存,必须使用参数apc.shm_segments增加段数

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

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

但切勿使用0的TTL。

正如C33所说,使用apc.php检查您的配置。将文件从apc包复制到webfolder并将浏览器指向它。您将看到实际分配了什么以及如何使用它。图形必须在数小时后保持稳定,如果它们在每次刷新时都完全改变,则表示您的设置错误(APC正在刷新所有内容)。分配比APC实际使用的安全余量多20%的ram,并定期检查

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


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

正如Bokan所提到的,如果可用,您可以增加内存,他正确地指出了将TTL设置为0的反效果

注意:这就是我为我的特定问题修复此错误的方法。这是一个一般性的问题,可能是由于分配了一些东西造成的,因此,如果您发现错误并且认为是由于将重复的PHP文件加载到APC中造成的,请遵循以下说明。

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

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); }
usermod -a -G vhost-user-group apache-user
apachectl restart
sudo /etc/init.d/httpd restart