Answers:
您可以使用PHP函数apc_clear_cache
。
调用apc_clear_cache()
将清除系统缓存,而调用apc_clear_cache('user')
将清除用户缓存。
php -r "apc_clear_cache();"
我认为这些答案都无法真正从命令行清除APC缓存。如上文的Frank Farmer所述,CLI在与Apache分开的进程中运行。
我从命令行清除的解决方案是编写一个脚本,该脚本将APC清除脚本复制到web
目录中并对其进行访问,然后将其删除。该脚本仅限于从本地主机访问。
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脚本就是这样一种方法。
如果要在命令:中清除apc缓存(如果需要,请使用sudo)
铜铜合金
php -r "apcu_clear_cache();"
装甲运兵车
php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
尚未提及的命令行用法的另一种可能性是使用curl。
如果您使用库存的apc.php脚本,这不能解决所有缓存条目的问题,但是它可以调用已改编的脚本或您已放置的另一个脚本。
这将清除操作码缓存:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"
将OB参数更改为3,以清除用户缓存:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"
将这两行都放在脚本中,然后在您的环境中用$ PASSWORD调用它。
如果要通过json监视结果,可以使用以下脚本:
<?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);
如其他答案中所述,必须通过http或curl调用此脚本,并且如果该脚本暴露在应用程序的Web根目录中,则必须加以保护。(通过ip,令牌...)
apc_clear_cache()仅适用于您希望清除缓存的同一PHP SAPI。如果您具有PHP-FPM并希望清除apc缓存,则必须通过其中一个php脚本(而不是命令行)来执行,因为这两个缓存是分开的。
我写了CacheTool,它是一个命令行工具,可以完全解决此问题,并且可以使用一个命令从命令行清除PHP-FPM APC缓存(它会为您连接到php-fpm并执行apc函数)
它也适用于opcache。
在这里查看其工作方式:http : //gordalina.github.io/cachetool/
APC的稳定器可以选择清除其接口本身中的缓存。要清除这些条目,您必须登录到apc界面。
APC可以选择在apc.php文件中设置用户名和密码。
php-apc
系统中已安装软件包,则将获得此界面。
创建APC.php文件
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
从浏览器运行它。
我的Symfony构建的解决方法是在同一台服务器上有很多实例:
步骤1.
创建触发器或设置文件标志的内容(例如Symfony命令),然后创建marker file
..
file_put_contents('clearAPCU','yes sir i can buggy')
步骤2.
在开始的索引文件上,添加清除代码并删除marker file
。
if(file_exists('clearAPCU')){
apcu_clear_cache();
unlink('clearAPCU');
}
第2步。 运行应用程序。