171

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

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

4

19 に答える 19

146

PHP関数を使用できますapc_clear_cache

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

于 2009-05-26T15:14:02.903 に答える
117

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

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

  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']);
    
于 2010-08-27T02:30:26.600 に答える
68

万人向けではないことはわかっていますが、Apache のグレースフルな再起動をしないのはなぜですか?

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

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful
于 2011-07-13T16:15:03.787 に答える
27

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

apc_clear_cache('opcode');

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

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

于 2010-06-15T20:14:49.207 に答える
11

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

service php-fpm reload(または、システム上のリロードコマンドが何であれ)

于 2013-04-23T19:47:09.420 に答える
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、トークンで...)

于 2015-10-13T10:25:29.877 に答える
4

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/

于 2014-09-23T14:12:02.077 に答える
2

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

service php5-fpm reload
于 2014-07-01T00:12:30.930 に答える
1

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

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

ここに画像の説明を入力

于 2013-11-14T05:26:43.037 に答える
0

私にとって良い解決策は、デプロイ後に古いユーザー キャッシュを使用しないことでした。

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

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

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

于 2012-12-12T15:24:27.930 に答える
0

APC.php ファイルの作成

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

ブラウザから実行します。

于 2012-10-05T10:25:49.353 に答える
-1

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

于 2010-06-17T06:42:30.087 に答える