サイトの新しいバージョンを展開するときに、すべてのAPCキャッシュエントリをクリアする必要があります。 APC.phpにはすべてのオペコードキャッシュをクリアするためのボタンがありますが、すべてのユーザーエントリ、すべてのシステムエントリ、またはすべてのディレクトリごとのエントリをクリアするボタンは表示されません。
コマンドラインまたは他の方法ですべてのキャッシュエントリをクリアすることは可能ですか?
PHP関数apc_clear_cache
を使用できます。
apc_clear_cache()
を呼び出すとシステムキャッシュがクリアされ、apc_clear_cache('user')
を呼び出すとユーザーキャッシュがクリアされます。
コマンドラインからAPCキャッシュをクリアするために、これらの回答が実際に機能するとは思わない。 Frank Farmer でコメントしたように、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および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のいくつかの古いバージョンにのみ適用されるようです。
使用しているバージョンに関係なく、cliスクリプトはmod_phpまたはfastcgiとは別のプロセスから実行されるため、php cliスクリプトからmod_phpまたはfastcgi APCキャッシュをクリアできません。キャッシュをクリアするプロセス(または子プロセス)内からapc_clear_cache()を呼び出す必要があります。 curlを使用して簡単なphpスクリプトを実行することは、そのようなアプローチの1つです。
コマンドでapcキャッシュをクリアする場合:(必要な場合はSudoを使用します)
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を使用することです。
これは、ストック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キャッシュをクリアしたい場合、2つのキャッシュが分離されているため、コマンドラインではなく、phpスクリプトの1つを使用して実行します。
CacheTool 、この問題を正確に解決するコマンドラインツールを作成しました。1つのコマンドでPHP-FPM APCキャッシュをコマンドラインからクリアできます関数)
Opcacheでも機能します。
ここでの仕組みをご覧ください: http://gordalina.github.io/cachetool/
ubuntuでfpmを実行する場合、以下のコードを実行する必要があります(12および14でチェック)
service php5-fpm reload
APCの安定版には、インターフェイス自体のキャッシュをクリアするオプションがあります。これらのエントリをクリアするには、apcインターフェイスにログインする必要があります。
APCには、apc.phpファイルでユーザー名とパスワードを設定するオプションがあります。
apc.ini
apc.stat = "1"は、APCが各リクエストでスクリプトをstat(チェック)して、変更されているかどうかを判断します。変更されている場合は、新しいバージョンを再コンパイルしてキャッシュします。
この設定がオフの場合、APCはチェックしません。通常、APCにファイルを再チェックさせるには、Webサーバーを再起動するか、キャッシュを手動でクリアする必要があります。 FastCGI Webサーバー構成では、再起動時にキャッシュがクリアされない場合があります。スクリプトファイルがめったに変更されない運用サーバーでは、統計を無効にするとパフォーマンスが大幅に向上します。
新しいAPC管理インターフェイスには、ユーザーキャッシュとオペコードキャッシュを追加/消去するオプションがあります。興味深い機能の1つは、opCodeキャッシュからディレクトリを追加/更新/削除することです。
同じサーバーに多数のインスタンスがある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.phpファイルを作成する
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
ブラウザから実行してください。
私にとって良い解決策は、展開後に古いユーザーキャッシュを使用しないことです。
各キーにプレフィックスを追加すると、キャッシュエントリのデータ構造の変更時にプレフィックスを変更できます。これは、デプロイ時に次の動作を取得するのに役立ちます。
これはユーザーキャッシュに対してのみ可能です。