新しいバージョンのサイトを展開するときに、すべての APC キャッシュ エントリをクリアする必要があります。APC.php にはすべてのオペコード キャッシュをクリアするためのボタンがありますが、すべてのユーザー エントリ、すべてのシステム エントリ、またはすべてのディレクトリごとのエントリをクリアするためのボタンが表示されません。
コマンドラインまたはその他の方法ですべてのキャッシュ エントリをクリアすることはできますか?
新しいバージョンのサイトを展開するときに、すべての 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($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 スクリプトを実行することは、そのようなアプローチの 1 つです。
NGINX / PHP-FPM スタックで実行している場合、最善の策はおそらく php-fpm をリロードすることです。
service php-fpm reload
(または、システム上のリロードコマンドが何であれ)
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() only works on the same php SAPI that you want you cache cleared. If you have PHP-FPM and want to clear apc cache, you have do do it through one of php scripts, NOT the command line, because the two caches are separated.
I have written CacheTool, a command line tool that solves exactly this problem and with one command you can clear your PHP-FPM APC cache from the commandline (it connects to php-fpm for you, and executes apc functions)
It also works for opcache.
See how it works here: http://gordalina.github.io/cachetool/
ubuntu で fpm を実行する場合は、以下のコードを実行する必要があります (12 と 14 でチェック)。
service php5-fpm reload
APC の安定版には、インターフェイス自体でキャッシュをクリアするオプションがあります。これらのエントリをクリアするには、apc インターフェイスにログインする必要があります。
APC には、apc.php ファイルでユーザー名とパスワードを設定するオプションがあります。
私にとって良い解決策は、デプロイ後に古いユーザー キャッシュを使用しないことでした。
各キーにプレフィックスを追加すると、キャッシュ エントリのデータ構造を変更する際にプレフィックスを変更できます。これは、デプロイ時に次の動作を得るのに役立ちます。
これは、ユーザー キャッシュでのみ可能です。
APC.php ファイルの作成
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
ブラウザから実行します。
APC と、ファイルへのシンボリック リンクへのシンボリック リンクに問題がありました。ファイル自体の変更を無視しているようです。どういうわけか、ファイル自体にタッチを実行すると役立ちました。ファイルを変更することと、ファイルに触れることの違いはわかりませんが、どういうわけかそれが必要でした...