题
当我部署新版本的站点时,我需要清除所有 APC 缓存条目。APC.php 有一个用于清除所有操作码缓存的按钮,但我没有看到用于清除所有用户条目、所有系统条目或所有每个目录条目的按钮。
是否可以通过命令行或其他方式清除所有缓存条目?
解决方案
可以使用PHP函数apc_clear_cache
。
调用apc_clear_cache()
将清除该系统的高速缓存和主叫apc_clear_cache('user')
将清除用户缓存。
其他提示
我不相信这些答案实际上可以用于从命令行清除 APC 缓存。作为 弗兰克·法默 如上所述,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或快速运行哪些版本。你必须要清除高速缓存中的过程(或子过程)中调用apc_clear_cache()。使用卷曲运行简单PHP脚本是一种这样的方法。
如果你想清除命令APC缓存:(如果你需要它的使用sudo的)
APCu
php -r "apcu_clear_cache();"
APC
php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
如果您要在NGINX / PHP-FPM堆栈上运行,你最好的选择是可能只是重新加载PHP-FPM
service php-fpm reload
(或任何你重载命令可以是在系统上)
如APC文献定义:
要清除高速缓存运行:
php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
有关命令行用法另一种可能性,尚未提到的,是使用卷曲。
这不会解决你的问题的所有缓存条目,如果您使用的股票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`"
把两条线在脚本并在ENV用$ 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或卷曲被调用,你将不得不如果在你的应用程序的Web根露出来固定。 (通过腹膜内,令牌...)
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文件中设置的用户名和密码。
如果运行ubuntu下FPM,需要运行下面的代码(检查了12和14)
service php5-fpm reload
apc.ini
apc.stat =“1”将迫使APC到STAT(检查)的脚本上的每个请求,以确定它是否已经被修改。如果已经修改了它会重新编译和缓存的新版本。
如果该设定是关闭的,APC将不检查,这通常意味着以迫使APC以重新检查文件,Web服务器将必须被重新启动或所述高速缓存将不得不手动清除。需要注意的是FastCGI的Web服务器配置可能无法清除重启缓存。在生产服务器上在脚本文件很少改变,一个显著的性能提升可以通过禁用统计来实现。
对我来说一个好的解决方案是在部署后不再使用过时的用户缓存。
如果为每个键添加前缀,则可以在更改缓存条目的数据结构时更改前缀。这将帮助您在部署时获得以下行为:
- 仅部署更新的结构后不要使用过时的缓存条目
- 不要在部署时清理整个缓存,以免减慢页面速度
- 恢复部署后可以重用一些旧的缓存条目(如果条目尚未自动删除)
- APC 将在过期后删除旧的缓存条目 或者 缺少缓存空间
这仅适用于用户缓存。
创建APC.php文件
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
从浏览器中运行它。
我的变通为symfony1.2建立在同一服务器具有实例的赃物:
<强>步骤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。强> 运行的应用程序。
我们曾与APC和符号链接符号链接到文件的一个问题 - 它似乎忽略文件本身的变化。对自身帮助文件不知何故进行触摸。我不知道什么是对矫正文件和触摸它的区别,但不知何故,这是必要的......