3

Opcache の実行中に Capistrano を介して新しい PHP コードをデプロイしようとしています。

Capistrano は、デプロイするたびに新しいデプロイ ディレクトリを作成し、Web サーバーが新しいディレクトリを指すようにシンボリック リンクを調整します。Opcache はファイルの実際のパスによってキャッシュされるため、サイトの新しくデプロイされたバージョンは古いバージョンとは完全に別個にキャッシュされることを意味します。

私たちが直面している問題は、Opcache がメモリを使い果たすことです。これは、新しいデプロイのたびに完全なコード ベースがキャッシュされ、古いコードが削除されないためです。を呼び出すこともできますopcache_reset()が、キャッシュがリセットされると、キャッシュが暴走するときに 500 エラーが一時的に発生します。(キャッシュをウォームアップせずに新しいデプロイを開始しようとすると、同じエラーが発生します。)

これを処理するより良い方法はありますか?opcache_reset()ライブサイトでの呼び出しを回避できるように、メモリがなくなるまで (またはファイルが多すぎるために空になるまで) opcache をいっぱいにせずに新しいコードを起動する方法はありますか? PHP-FPMがPHPリクエストを処理するWebサーバーとしてNginxを使用しています(またはとにかく移行しようとしています)。

4

1 に答える 1

1

opcache_invalidateオプションは、展開の最後にサイトの古いバージョンの各ファイルを呼び出すことです。無効化後にファイルを含めることで、キャッシュ スタンピードを防ぐことができます。

2 番目のオプションは、複数のプールを持つように fpm をセットアップし、それらを 1 つずつ再起動することです (それらはクリーンな opcache で開始されます)。nginxがさまざまなプールの負荷を分散できるため、キャッシュスタンピードをある程度防ぐことができます.

もう 1 つのオプションは、古いバージョンのスクリプトを削除することです。これにより、revalidate_freq が経過すると、opcache がそれらをキャッシュからクリアし、ファイルシステムから新しいファイルを強制的にロードします。

于 2015-01-13T04:23:21.953 に答える