如何清除APCcaching条目?

当我部署新版本的站点时,我需要清除所有的APCcaching条目。 APC.php有一个清除所有操作码高速caching的button,但是我没有看到清除所有用户条目或所有系统条目或所有每个目录条目的button。

是否有可能通过命令行或其他方式清除所有caching条目?

您可以使用PHP函数apc_clear_cache

调用apc_clear_cache()将清除系统caching,调用apc_clear_cache('user')将清除用户caching。

我不相信任何这些答案实际上是从命令行清除APCcaching。 正如Frank Farmer在上面评论的那样,CLI运行在一个独立于Apache的进程上。

我从命令行清除的解决scheme是编写一个脚本,将APC清除脚本复制到web目录并访问它,然后将其删除。 该脚本仅限于从本地主机访问。

  1. 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'); } 
  2. caching清除脚本

    该脚本将apc_clear.php复制到Web目录中,并访问它,然后将其删除。 这是基于Symfony的任务。 在Symfony版本中,调用Symfony的复制和取消链接forms来处理错误。 你可能想要添加检查,他们成功。

     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 

这在文档中没有说明,但要清除操作码caching,您必须执行以下操作:

 apc_clear_cache('opcode'); 

编辑:这似乎只适用于一些旧版本的APC ..

无论你使用什么版本,你都无法从php cli脚本中清除mod_php或fastcgi APCcaching,因为cli脚本将从mod_php或fastcgi的不同进程运行。 您必须在要清除caching的进程(或subprocess)内调用apc_clear_cache()。 使用curl来运行一个简单的PHP脚本就是这样的一种方法。

如果你想在命令中清除apccaching:(如果你需要使用sudo)

 php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');" 

如果你运行在NGINX / PHP-FPM栈上,最好的办法就是重新加载php-fpm

service php-fpm reload (或者你的重载命令可能在你的系统上)

尚未提及的命令行使用的另一种可能性是使用curl。

如果你正在使用stock apc.php脚本,这并不能解决所有caching条目的问题,但是它可以调用一个自适应脚本或者其他已经存在的脚本。

这将清除操作码caching:

 curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`" 

将OB参数更改为3以清除用户caching:

 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或curl来调用,如果它暴露在应用程序的web根目录下,你将不得不保证安全。 (通过ip,令牌…)

apc_clear_cache()只能用于你想要清除caching的PHP SAPI。 如果你有PHP-FPM并且想要清除apccaching,你可以通过一个php脚本来完成,而不是命令行,因为两个caching是分开的。

我已经写了CacheTool ,一个命令行工具,可以解决这个问题,一个命令就可以从命令行清除你的PHP-FPM APCcaching(它连接到你的php-fpm,并执行apc函数)

它也适用于opcache。

看看它是如何工作的: http : //gordalina.github.io/cachetool/

APC的稳定器可以select清除其接口本身的caching。 要清除这些条目,您必须login到apc界面。

APC可以select在apc.php文件中设置用户名和密码。

在这里输入图像描述

如果你在ubuntu下运行fpm,需要运行下面的代码(在12和14选中)

 service php5-fpm reload 

正如APC文件中所定义的那样:

清除caching运行:

 php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;' 

apc.ini

apc.stat =“1”将强制APC对每个请求上的脚本进行统计(检查)以确定它是否已被修改。 如果它已被修改,它将重新编译和caching新版本。

如果此设置处于closures状态,则APC将不检查,通常意味着要强制APC重新检查文件,必须重新启动Web服务器,否则必须手动清除caching。 请注意,FastCGI Web服务器configuration可能无法在重新启动时清除caching。 在脚本文件很less更改的生产服务器上,通过禁用统计信息可以显着提高性能。

新的APCpipe理界面可以select添加/清除用户caching和操作码caching,一个有趣的function是从opCodecaching添加/刷新/删除目录

APCpipe理文档

在这里输入图像描述

对我来说,一个好的解决scheme就是在部署完成后不再使用过时的用户caching。

如果为每个键添加前缀,则可以在更改caching条目的数据结构时更改前缀。 这将有助于您在部署中获得以下行为:

  1. 在部署更新的结构之后不要使用过时的caching条目
  2. 不要在部署中清理整个caching,以免让页面变慢
  3. 部分旧的caching条目可以在恢复部署后重新使用(如果条目尚未自动删除)
  4. APC将在失效后删除旧的caching条目丢失caching空间

这仅适用于用户caching。

创buildAPC.php文件

 foreach(array('user','opcode','') as $v ){ apc_clear_cache($v); } 

从您的浏览器运行它。

我为Symfony构build的解决scheme在同一个服务器上有实例的掠夺:

第1步。创build触发器或某些设置文件标志(例如Symfony命令),然后创buildmarker file

 file_put_contents('clearAPCU','yes sir i can buggy') 

步骤2.在索引文件开始处添加清除代码并删除marker file

 if(file_exists('clearAPCU')){ apcu_clear_cache(); unlink('clearAPCU'); } 

第2步。运行应用程序

我们遇到了APC和符号链接到文件的问题 – 它似乎忽略了文件本身的变化。 以某种方式执行接触文件本身帮助。 我不能告诉修改文件和触摸它有什么区别,但不知何故,这是必要的…