当我部署新版本的站点时,我需要清除所有 APC 缓存条目。APC.php 有一个用于清除所有操作码缓存的按钮,但我没有看到用于清除所有用户条目、所有系统条目或所有每个目录条目的按钮。

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

有帮助吗?

解决方案

可以使用PHP函数apc_clear_cache

调用apc_clear_cache()将清除该系统的高速缓存和主叫apc_clear_cache('user')将清除用户缓存。

其他提示

我不相信这些答案实际上可以用于从命令行清除 APC 缓存。作为 弗兰克·法默 如上所述,CLI 在与 Apache 分开的进程中运行。

我从命令行清除的解决方案是编写一个脚本,将 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. 缓存清理脚本

    该脚本将 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管理文档

“在这里输入的图像描述”

对我来说一个好的解决方案是在部署后不再使用过时的用户缓存。

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

  1. 仅部署更新的结构后不要使用过时的缓存条目
  2. 不要在部署时清理整个缓存,以免减慢页面速度
  3. 恢复部署后可以重用一些旧的缓存条目(如果条目尚未自动删除)
  4. 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和符号链接符号链接到文件的一个问题 - 它似乎忽略文件本身的变化。对自身帮助文件不知何故进行触摸。我不知道什么是对矫正文件和触摸它的区别,但不知何故,这是必要的......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top