15

インターネットでは、CLIで呼び出すとapc_cache_clear()、Apache内で実行されているかFPMによって実行されているかに関係なく、「Web」PHPプロセスからオペコードキャッシュがクリアされないという多くの議論があります(APCキャッシュエントリをクリアする方法を参照)。推奨される解決策として、を呼び出す単純なPHPページを作成しapc_cache_clear()、CLIから呼び出すことができます。SymfonyのApcBundleはそれを行います。

apc_cache_clear()fromCLIがApache/FPMからキャッシュを空にしない場合、 FPMワーカー間でキャッシュを空にしますか?HTTP経由で/clear_apc_cache.phpを呼び出すと、FPMワーカープロセスの1つによってのみ実行されます。それで、APCオペコードキャッシュは実際にプールとワーカーの間で共有されていますか?より具体的には、すべてのワーカーから自動的にクリアされますか?

4

3 に答える 3

25

すべてのphp-fpmワーカーは、親php-fpmプロセスと同じオペコードキャッシュを共有します。ソース。/apc_clear_cache.phpファイルがあり、それをHTTP経由で呼び出す場合(curlなどを使用)、同じphp-fpmマスタープロセスを使用してすべてのワーカーのオペコードキャッシュをクリアします。

このブログ記事には、apcがどのように機能するか、およびリリース中にapcを効果的にクリアする方法についての非常に優れた説明があります。

于 2012-10-19T20:16:50.573 に答える
11

FastCGIインターフェイスを介してスクリプトを直接実行する場合は、ファイルをWebサイトにデプロイしなくても、CLIを介してオペコードキャッシュをクリアできます。

サーバーでphp5-fpmキャッシュをクリアするために使用できるこの要点を作成しました。

UNIXソケットを使用している場合:

php clear-apc.php --sock /var/run/php5-fpm.sock

さもないと:

php clear-apc.php --port=[port]

またはデフォルトで省略127.0.0.1:9000

于 2013-05-06T05:30:54.870 に答える
3

少なくともPHP5.4ではFPMを使用し、オペコードキャッシュの内容に関する限り、異なるプールも同じAPCキャッシュを共有していることがわかりました。

これは私がそれに気づいた方法です:

複数のPHP-FPMプールを設定しました。各プールは、/ srv / www /domain.com/ディレクトリの下にchrootされています。

PHPスクリプトの主な場所は、/ srv / www / domain.com /docroot/です。

ここで、ファイル/srv/www/domain_1.com/docroot/test.phpを作成し、スクリプトをロードすると、表示される内容が表示されます。

ただし、ファイル/srv/www/domain_2.com/docroot/test.phpを作成すると、コンテンツはdomain_1.comにも表示されます。

これは、APCがファイルの場所をキャッシュのキーとして使用し、どちらの場合もキーが/docroot/test.phpであるために発生すると思います。

オペコードキャッシュのクリアは、単一のプールのみに制限される場合があります。私はこれをテストしていません。

編集オペコードキャッシュのクリアは単一のアプリプールに制限されません。apc_cache_clear()が呼び出されると、完全なAPCキャッシュがクリアされます。

また、apc.mmap_file_maskを使用して、プールごとに異なるマスクを指定しようとしました。これは何も変更しませんでした。1つのアプリプールファイルの更新が他のプールで見られました。

この動作は、apc.stat=0設定で観察されました。ファイルへのすべての変更はlsyncdで監視され、APCキャッシュ内のエントリの再コンパイルを強制します。

  • テロ
于 2013-01-17T13:48:09.477 に答える