APCキャッシュエントリをクリアする方法は?


170

新しいバージョンのサイトを展開するときに、すべてのAPCキャッシュエントリをクリアする必要があります。APC.phpにはすべてのオペコードキャッシュをクリアするためのボタンがありますが、すべてのユーザーエントリ、すべてのシステムエントリ、またはすべてのディレクトリごとのエントリをクリアするためのボタンが表示されません。

コマンドラインまたはその他の方法ですべてのキャッシュエントリをクリアすることは可能ですか?


1
期限切れのエントリをクリアする方法に興味があります!ttlを指定することはできますが、php.netのドキュメントでは、期限が切れると次のリクエストで消去されると記載されています...
Surrican

回答:


145

PHP関数を使用できますapc_clear_cache

呼び出しapc_clear_cache()はシステムキャッシュapc_clear_cache('user')をクリアし、呼び出しはユーザーキャッシュをクリアします。


20
コマンドラインでこれを行うには、apc.iniに移動して次のように設定する必要があることを発見しました。apc.enable_cli= 1
lo_fye 2009年

51
lo_fye:実際に機能しますか?私の経験では、APC CLIはApacheのAPCキャッシュから完全に分離されていることがわかりました。これは、CLIプロセスがApacheとは完全に別のプロセスで実行されるためです。
フランクファーマー

9
Frank Farmer:これは、PHP 5.3.10を実行するApacheまたはNginxとPHP-FPMインターフェースで動作することを確認しました。私はこのコマンドを実行するシェルスクリプトを作成しましたphp -r "apc_clear_cache();"
ezraspectre

13
これは、mod_phpを使用してPHPを実行している場合は機能しません。フランクファーマーが述べた理由で。
David

11
Ubuntu Server 12.04をNginxで、PHP-FPMをPHPバージョン5.4で実行しています。コマンドラインのapc_clear_cache()およびapc_clear_cache( 'user')は、ウェブサーバー/ウェブページのAPCキャッシュをクリアしません!!!
Pieter Vogelaar 2013年

117

コマンドラインからAPCキャッシュをクリアするためにこれらの回答が実際に機能するとは思いません。フランク・ファーマーは、上記のコメントは、プロセスでのCLIの実行は、Apacheから分離します。

コマンドラインから消去するための私の解決策は、APC消去スクリプトをwebディレクトリにコピーしてアクセスし、それを削除するスクリプトを記述することでした。スクリプトは、ローカルホストからのアクセスに制限されています。

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

8
サーバーを再起動することもできます。たとえば、mod_phpを使用している場合はApache、それを使用している場合はPHP FPMです。あなたのソリューションはよりエレガントです(サーバーの再起動は必要ありません)より複雑です:)
El Yobo

5
デプロイユーザーがsudoアクセスする必要がないため、これはphp-fpm / apacheを再起動するよりも優れています。複数のサーバーに展開している場合、各サーバーのsudoパスワードを入力するのは面倒です。
アンドリュー

個人的には、sudoパスワードを入力してもかまいません(私のデプロイメントスクリプトはパスワードを保存します)。しかし、ダウンタイムをできるだけ回避したいので、APCファイルのフラッシュに関心があります。Nginxの場合、ダウンタイムなしで再起動する(それほど簡単ではない)方法があります。PGPfcgiについてはわかりませんが、そうは思いません。APCをフラッシュするとダウンタイムが発生しますか?
ジュリアン、

@andrewパスワードを入力せずにsudoを使用するようにユーザーを設定できます。ジュリアンが言ったように、APCをクリアするだけで十分だとしても、それは確かに優れています。
ChocoDeveloper 2013

1
@Julien CPUを多用する結果などを保存している場合、サーバーの負荷が増える可能性があります。私はピーク時にはそれをしません。
ChocoDeveloper 2013

68

私はそれがすべての人のためではないことを知っていますが、Apacheを適切に再起動しないのはなぜですか?

たとえば、Centos / RedHat Linuxの場合:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful

4
これは理想的ではないことは承知していますが、迅速かつ汚い解決策としてこれを述べてくれてうれしいです。
Bryan Petty

1
このスレッドを再度開いて申し訳ありませんが、同じ問題に直面していて、cronjobがapache2の正常な再起動を理想的なものにしないのはなぜですか?このアプローチの欠点は何ですか?
user2028856 2014年

@ user2028856常にサーバーを完全に制御できるわけではない場合を除いて、問題はありません。だからそれがあなたのために働くなら-それを使ってください。
Tadas Sasnauskas 2014年

@TadasSasnauskas「常にサーバーを完全に制御できるわけではない」とはどういう意味ですか?つまり、30分ごとに実行すると、Apacheがクラッシュしたり、cronバックアップなどの他の実行中のアクションが中断したりしますか?
user2028856 2014年

@ user2028856 Webサーバーを再起動する機能のない共有サーバーでサイトをホストする可能性があることを意味しました。30分ごとにグレースフルリスタートを実行することは、apcを有効にしてcli経由でバックグラウンドワーカーを実行しないことを考えると問題ありません(長い話:場合によってはカーネルパニックを引き起こす可能性があります)
Tadas Sasnauskas 14年

29

これはドキュメントには記載されていませんが、オペコードキャッシュをクリアするには、次のことを行う必要があります。

apc_clear_cache('opcode');

編集:これは、APCの一部の古いバージョンにのみ適用されるようです。

使用しているバージョンに関係なく、cliスクリプトはmod_phpまたはfastcgiとは異なるプロセスから実行されるため、php cliスクリプトからmod_phpまたはfastcgi APCキャッシュをクリアすることはできません。キャッシュをクリアしたいプロセス(または子プロセス)内からapc_clear_cache()を呼び出す必要があります。curlを使用して単純なphpスクリプトを実行することは、そのようなアプローチの1つです。


1
追加する必要があります。mod_phpを実行していて、cli-mode phpを介してキャッシュをクリアしたい場合、2つは異なる環境で実行されているため、実際にはこれを実行できません。私の解決策は、file_get_contentsを使用してcliモードのphpにhttp経由でphpを呼び出させることでした。醜いですが、動作します。
ColinM

PHP-FPMサーバーがHTTP 1から分離する可能性があるため、実際のhttpサーバをインストールすることなく、直接、netcatを作品とのphp-FPMへの有効なFastCGIの要求のダンプをPipe'ing
baloo

この答えは間違っています。ドキュメントで説明されているように、指定されたパラメータが!= 'user'の場合、opcodeキャッシュは常にクリアされます。
naitsirch 2013年

@naitsirchおそらくこれは最新バージョンで修正されたバグだったのでしょう。私が回答を投稿した時点で、これは私にとってうまくいったものです。残念ながら、当時使用していたバージョンはわかりませんが、この回答は、私と同じバージョンを使用していた25人の他のユーザーにとって明らかに役立ちます。
ColinM 2013

12

コマンドでapcキャッシュをクリアしたい場合:(必要に応じてsudoを使用)

APCu

php -r "apcu_clear_cache();" 

APC

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

私の端末でそのようなエラーが発生しています。「PHPの致命的なエラー:行1のコマンドラインコードで未定義の関数apc_clear_cache()を呼び出しています」
RaviPatidar

1
|「グレップAPCのphp -m」あなたは適切にインストールされているAPCのテストする必要があります
レオベノア

9

NGINX / PHP-FPMスタックで実行している場合、おそらくphp-fpmをリロードすることをお勧めします。

service php-fpm reload (またはあなたのリロードコマンドがあなたのシステムにあるかもしれないものは何でも)


サービスphp5-fpm reloadはそれを機能させるものです。apc.phpステータスファイルをチェックし、キャッシュステータスがリセットされました。php.iniにオプションapc.stat = 0を追加した後、これが必要でした
Salem

5

APCドキュメントで定義されているとおり:

キャッシュ実行をクリアするには:

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

4

まだ言及されていない、コマンドライン使用のもう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を付けて呼び出します。


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、トークンによる...)


3

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/


2

APCの厩舎には、インターフェース自体のキャッシュをクリアするオプションがあります。これらのエントリをクリアするには、apcインターフェースにログインする必要があります。

APCには、apc.phpファイルにユーザー名とパスワードを設定するオプションがあります。

ここに画像の説明を入力してください


このページはどこにありますか?
Pacerier、2015

@Pacerier php-apcシステムにパッケージがインストールされている場合、このインターフェイスが表示されます。
見知らぬ人

2

ubuntuでfpmを実行する場合、以下のコードを実行する必要があります(12と14でチェック)

service php5-fpm reload

1

apc.ini

apc.stat = "1"の場合、APCは各リクエストのスクリプトを強制的に統計(チェック)して、変更されているかどうかを判断します。変更されている場合は、新しいバージョンを再コンパイルしてキャッシュします。

この設定がオフの場合、APCはチェックしません。これは通常、APCにファイルの再チェックを強制するには、Webサーバーを再起動するか、キャッシュを手動でクリアする必要があることを意味します。FastCGI Webサーバー構成では、再起動時にキャッシュがクリアされない場合があることに注意してください。スクリプトファイルがほとんど変更されない運用サーバーでは、統計を無効にすることでパフォーマンスを大幅に向上させることができます。


1

新しいAPC管理インターフェイスには、ユーザーキャッシュとopcodeキャッシュを追加/クリアするオプションがあります。興味深い機能の1つは、opCodeキャッシュからディレクトリを追加/更新/削除することです。

APC管理ドキュメント

ここに画像の説明を入力してください


0

私にとって良い解決策は、展開後に古いユーザーキャッシュを使用しないことです。

各キーにプレフィックスを追加すると、キャッシュエントリのデータ構造を変更するときにプレフィックスを変更できます。これにより、デプロイ時に次の動作が得られます。

  1. 更新された構造のみを展開した後は、古いキャッシュエントリを使用しない
  2. ページの速度を落とさないように、デプロイ時にキャッシュ全体をクリーンアップしないでください
  3. デプロイを元に戻した後、古いキャッシュエントリの一部を再利用できます(エントリがまだ自動的に削除されていない場合)
  4. APCは、有効期限が切れた後、または不足しているキャッシュスペースで古いキャッシュエントリを削除します

これは、ユーザーキャッシュでのみ可能です。


0

APC.phpファイルを作成する

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

ブラウザから実行してください。


2
私が理解している限り、CLIインスタンスは同じAPCキャッシュメモリセグメントを共有しないため、これは空の分離されたAPCキャッシュセグメントをクリアするだけです。
ABキャロル

ディストリビューションと構成によっては、APCキャッシュに個別のメモリセグメントがある場合があります。より一般的な解決策のために更新しました。
anshuman 2013年

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. アプリを実行します。


-1

APCとファイルへのシンボリックリンクへのシンボリックリンクに問題がありました。ファイル自体の変更は無視されているようです。どういうわけか、ファイル自体にタッチを実行すると役立ちました。ファイルの変更と変更の違いはわかりませんが、どういうわけか必要でした...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.