当我部署网站的新版本时,我需要清除所有APC缓存条目。 APC.php 有一个按钮可以清除所有opcode缓存,但我没有看到清除所有用户条目、所有系统条目或所有目录条目的按钮。
是否可以通过命令行或其他方式清除所有缓存条目?
当我部署网站的新版本时,我需要清除所有APC缓存条目。 APC.php 有一个按钮可以清除所有opcode缓存,但我没有看到清除所有用户条目、所有系统条目或所有目录条目的按钮。
是否可以通过命令行或其他方式清除所有缓存条目?
apc_clear_cache
。apc_clear_cache()
将清除系统缓存,而调用apc_clear_cache('user')
将清除用户缓存。php -r "apc_clear_cache();"
. - ezraspectreapc_clear_cache
(有关实现,请参见下面Jeremy的答案)。 - Fredrick Brennan我不认为这些答案中的任何一个真正适用于从命令行清除APC缓存。正如Frank Farmer在上面评论的那样,CLI运行在与Apache分离的进程中。
我从命令行清除缓存的解决方案是编写一个脚本,将一个APC清除脚本复制到web
目录中并访问它,然后删除它。该脚本只能从localhost访问。
apc_clear.php
这是脚本复制到Web目录中、访问和删除的文件。
<?php
if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')))
{
apc_clear_cache();
apc_clear_cache('user');
apc_clear_cache('opcode');
echo json_encode(array('success' => true));
}
else
{
die('SUPER TOP SECRET');
}
清除缓存脚本
该脚本将apc_clear.php复制到Web目录,访问它,然后删除它。这是基于Symfony任务的。在Symfony版本中,调用Symfony形式的复制和解除链接,来处理错误。你可能需要添加检查它们是否成功。
copy($apcPaths['data'], $apcPaths['web']); //'data' is a non web accessable directory
$url = 'http://localhost/apc_clear.php'; //use domain name as necessary
$result = json_decode(file_get_contents($url));
if (isset($result['success']) && $result['success'])
{
//handle success
}
else
{
//handle failure
}
unlink($apcPaths['web']);
我知道这不适用于每个人,但:为什么不进行优雅的Apache重新启动呢?
例如,在CentOS/RedHat Linux的情况下:
sudo service httpd graceful
Ubuntu:
sudo service apache2 graceful
虽然文档中没有说明,但要清除操作码缓存,您必须执行以下操作:
apc_clear_cache('opcode');
编辑:这似乎只适用于一些旧版本的APC..
无论你使用的是哪个版本,你都无法从一个PHP CLI脚本中清除mod_php或fastcgi APC缓存,因为CLI脚本将从与mod_php或fastcgi不同的进程中运行。您必须从要清除缓存的进程(或子进程)中调用apc_clear_cache()。使用curl运行简单的PHP脚本就是其中一种方法。
service php-fpm reload
(或在您的系统上,可能是任何重新加载命令)php -r "apcu_clear_cache();"
美国电源公司
php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
apc_clear_cache()仅适用于您想要清除缓存的相同php SAPI。如果您使用PHP-FPM并希望清除apc缓存,则必须通过其中一个php脚本而不是命令行来执行此操作,因为这两个缓存是分开的。
我编写了CacheTool,这是一个命令行工具,可以解决这个问题,只需一条命令即可从命令行清除您的PHP-FPM APC缓存(它会为您连接到php-fpm并执行apc函数)
它也适用于opcache。
请查看此处的工作原理:http://gordalina.github.io/cachetool/
<?php
$result1 = apc_clear_cache();
$result2 = apc_clear_cache('user');
$result3 = apc_clear_cache('opcode');
$infos = apc_cache_info();
$infos['apc_clear_cache'] = $result1;
$infos["apc_clear_cache('user')"] = $result2;
$infos["apc_clear_cache('opcode')"] = $result3;
$infos["success"] = $result1 && $result2 && $result3;
header('Content-type: application/json');
echo json_encode($infos);
还有一种命令行使用的可能性,尚未提到,那就是使用curl。
如果您正在使用默认的apc.php脚本,则这并不能解决所有缓存条目的问题,但它可以调用修改后的脚本或您放置的另一个脚本。
这将清除opcode缓存:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"
php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'