我偶尔会遇到服务器的内存分配限制,特别是对于像Wordpress这样臃肿的应用程序,但从未遇到过"无法为池分配内存"而且无法跟踪任何信息.
有谁知道这意味着什么?我试过增加memory_limit
没有成功.我还没有对该应用程序进行任何重大更改.有一天没有问题,第二天我遇到了这个错误.
使用TTL为0意味着APC将在内存不足时刷新所有缓存.该错误不再出现,但它使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_segments增加段数.
如果APC正在使用mmap内存,那么你没有限制.内存量仍由相同的选项apc.shm_size定义.
如果服务器上没有足够的内存,则使用filters选项来防止缓存较少访问的php文件.
但永远不要使用0的TTL.
正如c33s所说,使用apc.php来检查你的配置.将文件从apc包复制到web文件夹并将浏览器指向它.您将看到真正分配的内容及其使用方式.图表必须在数小时后保持稳定,如果它们在每次刷新时完全更改,则表示您的设置错误(APC正在刷新所有内容).分配比APC真正用作安全边际的公羊多20%,并定期检查.
仅允许32MB的默认值非常低.PHP是在服务器为64MB且大多数脚本每页使用一个php文件时设计的.如今,像Magento这样的解决方案需要超过10k个文件(APC中约为60Mb).你应该允许足够的内存,所以大多数PHP文件总是被缓存.这不是浪费,将操作码保存在ram中更有效,而不是在文件缓存中使用相应的原始php.现在我们可以找到具有24Gb内存的专用服务器,每月只需80美元,所以不要犹豫,允许几个GB到APC.我在托管5Magento商店和~40 wordpress网站的服务器上放入24GB的2GB,APC使用1.2GB.Magento安装数量为64MB,带有一些插件的Wordpress数量为40MB.
此外,如果您在同一台服务器上有开发网站.从缓存中排除它们.
可能与APC有关.
对于遇到此问题的人,请指定.ini设置.特别是你的apc.mmap_file_mask设置.
对于文件支持的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 =你想要的任何东西
编辑开始
@bokan告诉我,我应该在这里添加警告.
如果你有一个0的ttl,这意味着可以立即清除每个缓存的项目.因此,如果你有一个像2mb这样的小缓存大小和ttl为0,这会使apc变得无用,因为缓存中的数据总是被覆盖.
降低ttl只意味着缓存不能变满,只能使用无法替换的项目.
所以你必须在ttl和缓存大小之间选择一个很好的平衡.
在我的情况下,我的缓存大小为1GB,所以对我来说已经足够了.
编辑结束
在使用php 5.2.17的centos 5上有同样的问题,并注意到如果缓存大小很小并且ttl参数为"高"(如7200),同时有大量的php文件要缓存,那么缓存填满的速度相当快并且apc没有找到它可以删除的任何内容,因为缓存中的所有文件仍然适合ttl.
增加内存大小只是一个部分解决方案,如果缓存填满并且所有文件都在ttl中,您仍然会在此错误中运行.
所以我的解决方案是将ttl设置为0,所以apc填满了缓存,总是有可能apc为新数据清除一些内存.
希望有所帮助
编辑:另见:http://pecl.php.net/bugs/bug.php?id = 16966
下载http://pecl.php.net/get/APC解压缩并运行apc.php,你有一个很好的图表,你的缓存使用情况如何
运行apc.php脚本是了解问题所在的关键,IMO.这有助于我们正确调整缓存大小,目前似乎已经解决了问题.