[英]How to clear APC cache entries?
当我部署站点的新版本时,我需要清除所有 APC 缓存条目。 APC.php 有一个用于清除所有操作码缓存的按钮,但我没有看到用于清除所有用户条目、所有系统条目或所有每目录条目的按钮。
是否可以通过命令行或其他方式清除所有缓存条目?
您可以使用PHP函数apc_clear_cache
。
调用apc_clear_cache()
将清除系统缓存,调用apc_clear_cache('user')
将清除用户缓存。
我不相信这些答案中的任何一个实际上都可以用于从命令行清除APC缓存。 正如Frank Farmer在上面评论的那样,CLI在与Apache分开的进程中运行。
我从命令行清除的解决方案是编写一个脚本,将APC清除脚本复制到web
目录并访问它然后将其删除。 该脚本仅限于从localhost访问。
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和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']);
我知道并不适合所有人,但是:为什么不重新启动优雅的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或fastcgi。 您必须从要清除缓存的进程(或子进程)中调用apc_clear_cache()。 使用curl运行一个简单的PHP脚本就是这样一种方法。
如果要在命令中清除apc cache :(如果需要,请使用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;'
命令行使用的另一种可能性,尚未提及,是使用curl。
如果您正在使用stock 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或curl调用,如果它在应用程序的Web根目录中公开,则必须加以保护。 (通过ip,令牌......)
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对每个请求上的脚本进行统计(检查)以确定它是否已被修改。 如果它已被修改,它将重新编译并缓存新版本。
如果此设置关闭,APC将不会检查,这通常意味着强制APC重新检查文件,必须重新启动Web服务器或必须手动清除缓存。 请注意,FastCGI Web服务器配置可能无法在重新启动时清除缓存。 在脚本文件很少更改的生产服务器上,禁用统计信息可以显着提高性能。
创建APC.php文件
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
从浏览器运行它。
对我来说一个很好的解决方案是在部署后不再使用过时的用户缓存。
如果为每个键添加前缀,则可以在更改缓存条目的数据结构时更改前缀。 这将有助于您在部署时获得以下行为:
这仅适用于用户缓存。
我在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步。运行应用。
TL;DR:删除/storage/framework/cache/data/
缓存文件
我启用了 APC 但它没有安装(也无法安装),所以它抛出了Call to undefined function Illuminate\\Cache\\apc_store()
。
“好吧,我只是禁用它,它应该可以工作”。
嗯,不。 然后我陷入了Call to undefined function Illuminate\\Cache\\apc_delete()
我们遇到了APC和符号链接到文件的符号链接问题 - 它似乎忽略了文件本身的变化。 以某种方式对文件本身执行触摸有帮助。 我不知道修改文件和触摸文件之间有什么区别,但不知何故有必要......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.