web-dev-qa-db-ja.com

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

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

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

170
lo_fye

PHP関数apc_clear_cacheを使用できます。

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

143
Travis Beale

コマンドラインからAPCキャッシュをクリアするために、これらの回答が実際に機能するとは思わない。 Frank Farmer でコメントしたように、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および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']);
    
115
Jeremy Kauffman

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

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

Sudo service httpd graceful

Ubuntu:

Sudo service Apache2 graceful
67

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

apc_clear_cache('opcode');

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

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

29
ColinM

コマンドでapcキャッシュをクリアする場合:(必要な場合はSudoを使用します)

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
10
Léo Benoist

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

service php-fpm reload(またはシステムにリロードコマンドがある場合は何でも)

9
passion4code

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

キャッシュをクリアするには、次を実行します。

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

まだ言及していませんが、コマンドラインを使用する別の可能性は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を使用して呼び出します。

4
Andy Triggs

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

4
COil

apc_clear_cache()は、キャッシュをクリアするのと同じphp SAPIでのみ機能します。 PHP-FPMがあり、apcキャッシュをクリアしたい場合、2つのキャッシュが分離されているため、コマンドラインではなく、phpスクリプトの1つを使用して実行します。

CacheTool 、この問題を正確に解決するコマンドラインツールを作成しました。1つのコマンドでPHP-FPM APCキャッシュをコマンドラインからクリアできます関数)

Opcacheでも機能します。

ここでの仕組みをご覧ください: http://gordalina.github.io/cachetool/

3

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

service php5-fpm reload
2
hrnsky

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

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

enter image description here

2
vinothvetrivel

apc.ini

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

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

1
mal

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

APC管理ドキュメント

enter image description here

1
Jithin Jose

同じサーバーに多数のインスタンスがある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);
}

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

0
anshuman

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

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

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

これはユーザーキャッシュに対してのみ可能です。

0
mabe.berlin