171

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

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

4

19 回答 19

146

您可以使用 PHP 函数apc_clear_cache

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

于 2009-05-26T15:14:02.903 回答
117

我不相信这些答案中的任何一个实际上都适用于从命令行清除 APC 缓存。正如Frank Farmer上面评论的那样,CLI 在与 Apache 不同的进程中运行。

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

  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']);
    
于 2010-08-27T02:30:26.600 回答
68

我知道这并不适合所有人,但是:为什么不优雅地重新启动 Apache?

例如,在 Centos/RedHat Linux 的情况下:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful
于 2011-07-13T16:15:03.787 回答
27

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

apc_clear_cache('opcode');

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

无论您使用什么版本,您都无法从 php cli 脚本中清除 mod_php 或 fastcgi APC 缓存,因为 cli 脚本将从 mod_php 或 fastcgi 的不同进程运行。您必须从要为其清除缓存的进程(或子进程)中调用 apc_clear_cache()。使用 curl 运行一个简单的 php 脚本就是这样一种方法。

于 2010-06-15T20:14:49.207 回答
12

如果要在命令中清除 apc 缓存:(如果需要,请使用 sudo)

亚太铜

php -r "apcu_clear_cache();" 

装甲运兵车

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
于 2014-01-21T13:24:01.450 回答
11

如果您在 NGINX / PHP-FPM 堆栈上运行,最好的选择可能是重新加载 php-fpm

service php-fpm reload(或者你的系统上的任何重载命令)

于 2013-04-23T19:47:09.420 回答
4

命令行使用的另一种可能性(尚未提及)是使用 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 调用它。

于 2013-02-01T13:26:58.923 回答
4

apc_clear_cache() 仅适用于您希望清除缓存的同一 php SAPI。如果你有 PHP-FPM 并且想要清除 apc 缓存,你必须通过一个 php 脚本来完成,而不是命令行,因为这两个缓存是分开的。

我已经编写了CacheTool,这是一个命令行工具,可以完全解决这个问题,并且使用一个命令,您可以从命令行清除您的 PHP-FPM APC 缓存(它为您连接到 php-fpm,并执行 apc 函数)

它也适用于 opcache。

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

于 2014-09-23T14:12:02.077 回答
4

如 APC 文档中所定义:

要清除缓存运行:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
于 2015-08-06T06:17:43.743 回答
4

如果你想通过 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,令牌...)

于 2015-10-13T10:25:29.877 回答
2

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

service php5-fpm reload
于 2014-07-01T00:12:30.930 回答
1

APC 的马厩可以选择清除其接口本身的缓存。要清除这些条目,您必须登录到 apc 界面。

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

在此处输入图像描述

于 2013-11-14T05:26:43.037 回答
1

apc.ini

apc.stat = "1" 将强制 APC 统计(检查)每个请求的脚本,以确定它是否已被修改。如果它已被修改,它将重新编译并缓存新版本。

如果此设置关闭,APC 将不检查,这通常意味着要强制 APC 重新检查文件,必须重新启动 Web 服务器或手动清除缓存。请注意,FastCGI Web 服务器配置可能不会在重新启动时清除缓存。在脚本文件很少更改的生产服务器上,禁用统计信息可以显着提高性能。

于 2014-01-27T23:14:50.107 回答
1

新的 APC 管理界面具有添加/清除用户缓存和操作码缓存的选项,一个有趣的功能是从操作码缓存添加/刷新/删除目录

APC 管理员文档

在此处输入图像描述

于 2014-07-04T01:47:47.437 回答
0

创建 APC.php 文件

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

从浏览器运行它。

于 2012-10-05T10:25:49.353 回答
0

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

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

  1. 仅部署更新的结构后不要使用过时的缓存条目
  2. 不要在部署时清理整个缓存,以免降低页面速度
  3. 恢复部署后可以重复使用一些旧的缓存条目(如果条目尚未自动删除)
  4. APC 将在过期缺少缓存空间后删除旧缓存条目

这仅适用于用户缓存。

于 2012-12-12T15:24:27.930 回答
0

我为 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. 运行应用程序。

于 2017-06-07T06:51:50.293 回答
0

TL;DR:删除缓存文件/storage/framework/cache/data/

我启用了 APC,但它没有安装(也无法安装),所以它抛出了Call to undefined function Illuminate\Cache\apc_store().

“好的,我只是禁用它,它应该可以工作”。

嗯,不。然后我被困住了Call to undefined function Illuminate\Cache\apc_delete()

于 2021-12-20T15:40:44.050 回答
-1

我们在 APC 和文件符号链接的符号链接方面遇到了问题——它似乎忽略了文件本身的变化。不知何故,对文件本身进行触摸有所帮助。我不知道修改文件和触摸它有什么区别,但不知何故这是必要的......

于 2010-06-17T06:42:30.087 回答