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