CentOS Stream 9 + PHP 8.1 + OPcache

CentOS Stream 9の環境でPHP OPcacheをインストールしたときの覚書。
CentOSの環境ではPHP OPcacheが自動でオンになると思ったらなってなかった。
参考: FreeBSD14 + PHP8.3 + OPcache

環境: CentOS Stream 9, nginx 1.20.1, PHP 8.1.27


1. OPcacheのインストール

まずはインストールされているか確認。
# php -i | grep opcache

dnfでインストール。
# dnf search opcache
# dnf install php-opcache

iniファイルの場所を確認。
# php --ini

php infoでも確認。
# php -i | grep opcache

opcache.blacklist_filename => /etc/php.d/opcache*.blacklist => /etc/php.d/opcache*.blacklist
opcache.consistency_checks => 0 => 0
opcache.dups_fix => Off => Off
opcache.enable => On => On
opcache.enable_cli => On => On
opcache.enable_file_override => Off => Off
opcache.error_log => no value => no value
opcache.file_cache => no value => no value
opcache.file_cache_consistency_checks => On => On
opcache.file_cache_only => Off => Off
opcache.file_update_protection => 2 => 2
opcache.force_restart_timeout => 180 => 180
opcache.huge_code_pages => Off => Off
opcache.interned_strings_buffer => 8 => 8
opcache.jit => tracing => tracing
opcache.jit_bisect_limit => 0 => 0
opcache.jit_blacklist_root_trace => 16 => 16
opcache.jit_blacklist_side_trace => 8 => 8
opcache.jit_buffer_size => 0 => 0
opcache.jit_debug => 0 => 0
opcache.jit_hot_func => 127 => 127
opcache.jit_hot_loop => 64 => 64
opcache.jit_hot_return => 8 => 8
opcache.jit_hot_side_exit => 8 => 8
opcache.jit_max_exit_counters => 8192 => 8192
opcache.jit_max_loop_unrolls => 8 => 8
opcache.jit_max_polymorphic_calls => 2 => 2
opcache.jit_max_recursive_calls => 2 => 2
opcache.jit_max_recursive_returns => 2 => 2
opcache.jit_max_root_traces => 1024 => 1024
opcache.jit_max_side_traces => 128 => 128
opcache.jit_prof_threshold => 0.005 => 0.005
opcache.lockfile_path => /tmp => /tmp
opcache.log_verbosity_level => 1 => 1
opcache.max_accelerated_files => 10000 => 10000
opcache.max_file_size => 0 => 0
opcache.max_wasted_percentage => 5 => 5
opcache.memory_consumption => 128 => 128
opcache.opt_debug_level => 0 => 0
opcache.optimization_level => 0x7FFEBFFF => 0x7FFEBFFF
opcache.preferred_memory_model => no value => no value
opcache.preload => no value => no value
opcache.preload_user => no value => no value
opcache.protect_memory => Off => Off
opcache.record_warnings => Off => Off
opcache.restrict_api => no value => no value
opcache.revalidate_freq => 2 => 2
opcache.revalidate_path => Off => Off
opcache.save_comments => On => On
opcache.use_cwd => On => On
opcache.validate_permission => Off => Off
opcache.validate_root => Off => Off
opcache.validate_timestamps => On => On

FreeBSDの記事を参考にOPcacheの設定。
参考: FreeBSD14 + PHP8.3 + OPcache
# less /etc/php.d/10-opcache.ini

; OPcache拡張モジュールを有効化
zend_extension=opcache.so

[opcache]
; OPcacheを有効にする
opcache.enable=1

; CLI版のPHPでも有効にする (WP-CLIやcronジョブが高速化)
opcache.enable_cli=1

; --- パフォーマンス最優先の本番設定 ---

; ★最重要: ファイルのタイムスタンプチェックを無効化。本番環境でのパフォーマンスを最大化。
; ※注意: テーマやプラグインの更新後は、必ずphp-fpmのリロードが必要です。
opcache.validate_timestamps=0

; --- メモリ関連 (12GB VM / WordPress向け) ---

; OPcacheが使用する共有メモリ量(MB)。
; WordPressはファイル数が多いため、256MBは堅実な出発点です。
; ZFS ARCやDBとの共存を考え、過剰な割り当ては避けます。
opcache.memory_consumption=512M

; PHP内部の文字列を保持するためのメモリ量(MB)。
; WordPressや多くのプラグインは文字列を多用するため、32MBを推奨。
opcache.interned_strings_buffer=32M

; キャッシュできるファイル数の上限。
; WordPressコア + テーマ + 多数のプラグインを想定し、多めに設定します。
; 20000あれば、ほとんどのサイトで不足することはありません。
opcache.max_accelerated_files=20000

; --- 互換性と安定性 (WordPress向け) ---

; ★重要: コメントをキャッシュに含める。
; WordPressはプラグインやテーマのヘッダー情報をファイルのコメントから読み取るため、これは必須です。
opcache.save_comments=1

; PHP 8.x のJIT(Just-In-Time)コンパイラを有効化。
; 'tracing'モードはWebアプリケーションのパフォーマンスと安定性のバランスが最も良い。
opcache.jit_buffer_size=128M
opcache.jit=tracing

; --- その他 ---

; メモリの浪費をチェックする頻度(秒)。デフォルトの60秒でOK。
opcache.revalidation_freq=60

デフォルトでopcache.blacklist_filenameとopcache.huge_code_pagesの設定があったけど無視していい。

テストしてphp-fpmを再起動。
# php-fpm -t
# systemctl reload php-fpm

設定値を確認。
# php -i | grep opcache


前の記事を参考にopcacheの状況を可視化するツールをインストール。
参考: FreeBSD14 + PHP8.3 + OPcache



▼ 関連記事