我偶尔会遇到服务器的内存分配限制,特别是在使用像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中的段数。如果您遇到此问题,请指定您的.ini设置,具体来说是您的apc.mmap_file_mask设置。
对于基于文件的mmap,它应该设置为类似以下内容:
apc.mmap_file_mask=/tmp/apc.XXXXXX
要直接从/dev/zero进行内存映射,请使用:
apc.mmap_file_mask=/dev/zero
对于符合POSIX标准的共享内存支持的mmap,请使用:
apc.mmap_file_mask=/apc.shm.XXXXXX
file_mask
不是这些值之一时,会出现错误吗?如果我有其中一个值并且仍然遇到错误,我需要将其切换为另一个值吗?那么应该是哪一个? - Jeff编辑开始
@bokan建议在这里加一个警告。
如果ttl为0,这意味着每个缓存项目可以立即被清除。因此,如果您有一个像2MB这样的小缓存大小和ttl为0,这将使APC变得无用,因为缓存中的数据总是被覆盖。
降低ttl意味着缓存永远不会变满,只有不能替换的项目才能填充它。
因此,您必须在ttl和缓存大小之间选择一个良好的平衡。
在我的情况下,我有一个1GB的缓存大小,所以对我来说足够了。
编辑结束
我在CentOS 5上使用PHP 5.2.17时遇到了同样的问题,发现如果缓存大小很小且ttl参数“高”(如7200),并且有许多要缓存的PHP文件,则缓存会很快填满,并且APC找不到任何可以删除的内容,因为所有文件都仍适合ttl。
增加内存大小只是部分解决方案,如果您的缓存填满了,并且所有文件都在ttl之内,您仍然会遇到此错误。
因此,我的解决方案是将ttl设置为0,以便APC填满缓存,总是有可能清除一些内存以获取新数据。
希望这有所帮助。
编辑: 请参见:http://pecl.php.net/bugs/bug.php?id=16966
下载http://pecl.php.net/get/APC,提取并运行apc.php,您将看到一个漂亮的图表,显示您的缓存使用情况。
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);
}
这对我们的团队(在同一服务器上运行多个WordPress网站)起作用。
我们在 /etc/php.d/apc.ini 文件中更改了内存设置。它被设置为64M,所以我们将其加倍到128M。
apc.shm_size=128M
从互联网上看,可能有各种原因。在我的情况下,除了...
apc.shm_size = 64M
...我已经清除了之前收到的无数警告。