如何清除APC缓存条目?

时间:2009-05-26 15:00:22

标签: php performance caching apc

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

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

18 个答案:

答案 0 :(得分:143)

您可以使用PHP函数apc_clear_cache

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

答案 1 :(得分:115)

我不相信这些答案中的任何一个实际上都可以用于从命令行清除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和unlink,它们处理错误。您可能希望添加成功的检查。

    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']);
    

答案 2 :(得分:67)

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

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

sudo service httpd graceful

Ubuntu的:

sudo service apache2 graceful

答案 3 :(得分:29)

这在文档中没有说明,但要清除操作码缓存,您必须这样做:

apc_clear_cache('opcode');

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

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

答案 4 :(得分:10)

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

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

答案 5 :(得分:9)

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

service php-fpm reload(或您系统上的重载命令)

答案 6 :(得分:5)

如APC文件中所定义:

清除缓存运行:

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

答案 7 :(得分: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,令牌......)

答案 8 :(得分: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`"

将两行放入脚本中并在env。中调用$ PASSWORD。

答案 9 :(得分:3)

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

我编写了CacheTool,这是一个命令行工具,可以解决这个问题,只需一个命令就可以从命令行清除PHP-FPM APC缓存(它连接到php-fpm,并执行apc功能)

它也适用于opcache。

了解它的工作原理:http://gordalina.github.io/cachetool/

答案 10 :(得分:2)

APC的稳定版具有清除其界面本身的缓存的选项。要清除这些条目,您必须登录apc界面。

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

enter image description here

答案 11 :(得分:2)

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

service php5-fpm reload

答案 12 :(得分:1)

apc.ini

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

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

答案 13 :(得分:1)

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

APC Admin Documentation

enter image description here

答案 14 :(得分:0)

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

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

  1. 在仅部署更新的结构后,请勿使用过时的缓存条目
  2. 不要在部署时清理整个缓存以减慢页面速度
  3. 恢复部署后可以重复使用一些旧的缓存条目(如果条目未自动删除)
  4. APC将在丢失缓存空间 OR 到期后删除旧的缓存条目
  5. 这仅适用于用户缓存。

答案 15 :(得分:0)

创建APC.php文件

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

从浏览器运行。

答案 16 :(得分: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步。 运行app。

答案 17 :(得分:-1)