当前位置:  开发笔记 > 编程语言 > 正文

在PHP中导致"无法为池分配内存"的原因是什么?

如何解决《在PHP中导致"无法为池分配内存"的原因是什么?》经验,为你挑选了4个好方法。

我偶尔会遇到服务器的内存分配限制,特别是对于像Wordpress这样臃肿的应用程序,但从未遇到过"无法为池分配内存"而且无法跟踪任何信息.

有谁知道这意味着什么?我试过增加memory_limit没有成功.我还没有对该应用程序进行任何重大更改.有一天没有问题,第二天我遇到了这个错误.



1> bokan..:

使用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.

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


这个!我正在运行Wordpress,32M还不够.高达64M,现在已经明确了.检查apc.php的人!

2> Frankie..:

可能与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


我无法理解这个答案是如何解决这个问题的.当`file_mask`不是这些值之一时,是否会发生错误?如果我有其中一个值并且我收到错误,我是否需要将其切换到另一个?哪一个?
有关此APC设置的更多信息:http://php.net/apc.configuration#ini.apc.mmap-file-mask
我发现这些更改不能解决问题,因为链接线程上的注释也记录了......
在我的情况下,我不得不从文件备份更改为POSIX兼容,以摆脱错误.

3> c33s..:

我的解决方案:

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几乎被禁用.每次内存已满时,它将刷新所有缓存.请阅读Brideau给我们的手册.php.net/manual/en/apc.configuration.php#ini.apc.ttl.
谢谢,这确实有帮助.我每秒钟得到十几个"无法分配内存"错误.我将缓存大小加倍(32到64 MB)并将ttl降为0.这完全消除了这些错误.

4> 小智..:

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有