新しいバージョンのサイトを展開するときに、すべてのAPCキャッシュエントリをクリアする必要があります。APC.phpにはすべてのオペコードキャッシュをクリアするためのボタンがありますが、すべてのユーザーエントリ、すべてのシステムエントリ、またはすべてのディレクトリごとのエントリをクリアするためのボタンが表示されません。
コマンドラインまたはその他の方法ですべてのキャッシュエントリをクリアすることは可能ですか?
新しいバージョンのサイトを展開するときに、すべてのAPCキャッシュエントリをクリアする必要があります。APC.phpにはすべてのオペコードキャッシュをクリアするためのボタンがありますが、すべてのユーザーエントリ、すべてのシステムエントリ、またはすべてのディレクトリごとのエントリをクリアするためのボタンが表示されません。
コマンドラインまたはその他の方法ですべてのキャッシュエントリをクリアすることは可能ですか?
回答:
PHP関数を使用できますapc_clear_cache
。
呼び出しapc_clear_cache()
はシステムキャッシュapc_clear_cache('user')
をクリアし、呼び出しはユーザーキャッシュをクリアします。
php -r "apc_clear_cache();"
コマンドラインからAPCキャッシュをクリアするためにこれらの回答が実際に機能するとは思いません。フランク・ファーマーは、上記のコメントは、プロセスでのCLIの実行は、Apacheから分離します。
コマンドラインから消去するための私の解決策は、APC消去スクリプトをweb
ディレクトリにコピーしてアクセスし、それを削除するスクリプトを記述することでした。スクリプトは、ローカルホストからのアクセスに制限されています。
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($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の一部の古いバージョンにのみ適用されるようです。
使用しているバージョンに関係なく、cliスクリプトはmod_phpまたはfastcgiとは異なるプロセスから実行されるため、php cliスクリプトからmod_phpまたはfastcgi APCキャッシュをクリアすることはできません。キャッシュをクリアしたいプロセス(または子プロセス)内からapc_clear_cache()を呼び出す必要があります。curlを使用して単純なphpスクリプトを実行することは、そのようなアプローチの1つです。
コマンドで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;'
まだ言及されていない、コマンドライン使用のもう1つの可能性は、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を付けて呼び出します。
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キャッシュをクリアしたい場合、2つのキャッシュが分離されているため、コマンドラインではなく、phpスクリプトの1つを介して実行する必要があります。
この問題を正確に解決するコマンドラインツールであるCacheToolを作成しました。1つのコマンドで、コマンドラインからPHP-FPM APCキャッシュをクリアできます(php-fpmに接続してapc関数を実行します)。
また、opcacheでも機能します。
ここでそれがどのように機能するかを見てください:http : //gordalina.github.io/cachetool/
APCの厩舎には、インターフェース自体のキャッシュをクリアするオプションがあります。これらのエントリをクリアするには、apcインターフェースにログインする必要があります。
APCには、apc.phpファイルにユーザー名とパスワードを設定するオプションがあります。
php-apc
システムにパッケージがインストールされている場合、このインターフェイスが表示されます。
apc.ini
apc.stat = "1"の場合、APCは各リクエストのスクリプトを強制的に統計(チェック)して、変更されているかどうかを判断します。変更されている場合は、新しいバージョンを再コンパイルしてキャッシュします。
この設定がオフの場合、APCはチェックしません。これは通常、APCにファイルの再チェックを強制するには、Webサーバーを再起動するか、キャッシュを手動でクリアする必要があることを意味します。FastCGI Webサーバー構成では、再起動時にキャッシュがクリアされない場合があることに注意してください。スクリプトファイルがほとんど変更されない運用サーバーでは、統計を無効にすることでパフォーマンスを大幅に向上させることができます。
新しいAPC管理インターフェイスには、ユーザーキャッシュとopcodeキャッシュを追加/クリアするオプションがあります。興味深い機能の1つは、opCodeキャッシュからディレクトリを追加/更新/削除することです。
私にとって良い解決策は、展開後に古いユーザーキャッシュを使用しないことです。
各キーにプレフィックスを追加すると、キャッシュエントリのデータ構造を変更するときにプレフィックスを変更できます。これにより、デプロイ時に次の動作が得られます。
これは、ユーザーキャッシュでのみ可能です。
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. アプリを実行します。
APCとファイルへのシンボリックリンクへのシンボリックリンクに問題がありました。ファイル自体の変更は無視されているようです。どういうわけか、ファイル自体にタッチを実行すると役立ちました。ファイルの変更と変更の違いはわかりませんが、どういうわけか必要でした...