端くれプログラマの備忘録 PHP [PHP] OPCacheにはエビクションがない?

[PHP] OPCacheにはエビクションがない?

PHPのOPcacheでは、割り当てられたメモリがいっぱいになっても古いファイルを自動的に削除する(エビクションする)機能はありません

OPcacheのキャッシュ動作に関するポイント

  1. キャッシュの削除(エビクション)は行われない
    • OPcacheは、割り当てられたメモリ内でのみ動作します。
    • メモリが不足した場合、新しいスクリプトをキャッシュに追加できず、古いスクリプトを削除することもありません。
  2. 新しいスクリプトがキャッシュされない
    • メモリがいっぱいの場合、ログに警告が出力されるとともに、キャッシュに空きがないため、新しいスクリプトを追加できなくなります。
    • その結果、新しいスクリプトは毎回ディスクから読み込まれます。
  3. 既存のキャッシュは保持される
    • メモリがいっぱいになっても、既にキャッシュされているスクリプトは引き続き利用されます。

なぜエビクションがないのか?

  • OPcacheは高速化を目的としており、スクリプトの再コンパイルを最小限にする設計になっています。そのため、意図的にキャッシュからファイルを削除することで性能を低下させるような処理を避けています。
  • キャッシュの効率を高めるには、メモリ割り当てを十分に大きく設定する必要があります。

対策

メモリ不足を防ぐために以下の設定を調整できます:

  1. メモリの割り当てを増やす
   opcache.memory_consumption=256  ; デフォルトは128MB
  1. キャッシュ可能なスクリプト数を増やす
   opcache.max_accelerated_files=10000  ; デフォルトは10000(スクリプト数が多い場合は増やす)
  1. メモリ内の不要なエントリを定期的に削除する
  • opcache.force_restart_timeoutでキャッシュのリセットタイミングを設定します。
   opcache.force_restart_timeout=3600  ; デフォルトは180秒
  1. モニタリングツールの利用
  • OPcacheのキャッシュ状況を監視するため、opcache_get_status()や専用のダッシュボードツールを活用し、メモリ使用状況を把握します。

結論

OPcacheは、メモリ不足時に古いスクリプトを削除して新しいスクリプトをキャッシュする仕組みを持っていません。そのため、適切な設定とモニタリングが必要です。もしメモリ不足が頻発する場合、割り当てるメモリを増やしたり、スクリプトの整理を検討する必要があります。