2026年5月20日
2026年5月20日
WordPressのOPcache設定|PHP-FPMでの推奨値・状態の確認・キャッシュのクリア
OPcache は、PHP のスクリプトをコンパイルした結果(オペコード)を共有メモリに保存し、次のリクエストからはコンパイルを省く仕組みです。WordPress は1回の表示で数百のPHPファイルを読み込むため、OPcache が有効かどうか、メモリが足りているかで応答時間が変わります。
この記事では、WordPress を動かす PHP-FPM で OPcache を確認・設定する手順を説明します。パスは2026年10月時点の Ubuntu 24.04(PHP 8.3)を例にしています。ほかのバージョンでは 8.3 の部分を読み替えてください。
コマンドラインとPHP-FPMは設定が別
最初に押さえておきたいのは、php コマンド(CLI)と PHP-FPM(Web)は別々の設定ファイルを読み、別々のキャッシュを持つことです。
| 設定ファイルの場所(Ubuntu) | OPcache の既定 | |
|---|---|---|
CLI(php・WP-CLI) |
/etc/php/8.3/cli/ |
opcache.enable_cli=0(無効) |
| PHP-FPM(Web) | /etc/php/8.3/fpm/ |
opcache.enable=1(有効) |
このため、php -r 'var_dump(opcache_get_status());' のように CLI で状態を調べても、false(無効)と出るのが普通で、Web 側の状態は分かりません。同じ理由で、wp eval 'opcache_reset();' を実行しても消えるのは CLI のキャッシュだけで、PHP-FPM のキャッシュは残ります。
PHP-FPMで有効になっているか確認する
PHP-FPM が読み込んでいる設定値は、次のコマンドで確認できます。
php-fpm8.3 -i | grep -E '^opcache\.(enable|memory_consumption|interned_strings_buffer|max_accelerated_files|validate_timestamps|revalidate_freq|jit) '
WordPress の管理画面からは「ツール → サイトヘルス → 情報 → サーバー」でも PHP のバージョンや SAPI を確認できますが、OPcache の使用状況(メモリの残りやヒット率)は表示されません。使用状況を見るには、Web 側で opcache_get_status() を呼ぶ必要があります。
管理画面で使用状況を見る小さなプラグイン
次のファイルを wp-content/mu-plugins/opcache-status.php として置くと、「ツール → OPcache の状態」に使用状況が表示されます。管理者(manage_options の権限を持つユーザー)だけが見られます。調べ終わったら削除してかまいません。
<?php
/**
* Plugin Name: OPcache Status (管理画面表示)
*/
add_action( 'admin_menu', function () {
add_management_page( 'OPcache の状態', 'OPcache の状態', 'manage_options', 'opcache-status', function () {
if ( ! function_exists( 'opcache_get_status' ) ) {
echo '<div class="wrap"><p>OPcache 拡張が読み込まれていません。</p></div>';
return;
}
$s = opcache_get_status( false );
if ( ! $s ) {
echo '<div class="wrap"><p>OPcache は無効か、opcache.restrict_api で呼び出しが制限されています。</p></div>';
return;
}
$mb = 1024 * 1024;
$mem = $s['memory_usage'];
$st = $s['opcache_statistics'];
$str = $s['interned_strings_usage'];
$rows = array(
'使用メモリ (MB)' => round( $mem['used_memory'] / $mb, 1 ),
'空きメモリ (MB)' => round( $mem['free_memory'] / $mb, 1 ),
'無駄になったメモリ (%)' => round( $mem['current_wasted_percentage'], 2 ),
'文字列バッファ 使用/全体 (MB)' => round( $str['used_memory'] / $mb, 1 ) . ' / ' . round( $str['buffer_size'] / $mb, 1 ),
'キャッシュ済みスクリプト' => $st['num_cached_scripts'],
'キー数 / 上限' => $st['num_cached_keys'] . ' / ' . $st['max_cached_keys'],
'ヒット率 (%)' => round( $st['opcache_hit_rate'], 2 ),
'メモリ不足による再起動' => $st['oom_restarts'],
'キー不足による再起動' => $st['hash_restarts'],
'満杯 (cache_full)' => $s['cache_full'] ? 'はい' : 'いいえ',
);
echo '<div class="wrap"><h1>OPcache の状態</h1><table class="widefat striped"><tbody>';
foreach ( $rows as $label => $value ) {
printf( '<tr><th>%s</th><td>%s</td></tr>', esc_html( $label ), esc_html( (string) $value ) );
}
echo '</tbody></table></div>';
} );
} );
見るべき項目は次のとおりです。
| 項目 | 状態 | 対応 |
|---|---|---|
| 空きメモリ | ほぼ0、cache_full が「はい」 |
opcache.memory_consumption を増やす |
| 文字列バッファ | 使用量が全体に近い | opcache.interned_strings_buffer を増やす |
| キー数 / 上限 | 上限に近い、「キー不足による再起動」が増える | opcache.max_accelerated_files を増やす |
| メモリ不足による再起動 | 0 でない | opcache.memory_consumption を増やす |
ヒット率は、PHP-FPM の起動直後やキャッシュのクリア直後は低く出ます。しばらく運用してから見ます。
設定値を決める
主な設定の既定値(PHP マニュアルより)と、WordPress での目安は次のとおりです。
| 設定 | 既定値 | 目安 |
|---|---|---|
opcache.memory_consumption |
128(MB) | 128〜256。プラグインが多い、複数サイトを同じ PHP-FPM で動かすなら上の使用状況を見て増やす |
opcache.interned_strings_buffer |
8(MB) | 16 程度。使用状況を見て調整 |
opcache.max_accelerated_files |
10000 | サイトの PHP ファイル数より多く。実際の上限は、指定値以上で最小の素数(223、463、983、1979、3907、7963、16229、32531、65407 …)になる |
opcache.validate_timestamps |
1 | 下の「ファイルの更新チェック」を参照 |
opcache.revalidate_freq |
2(秒) | validate_timestamps=1 のとき、何秒ごとに更新を確かめるか |
opcache.save_comments |
1 | 1 のまま。0 にすると、ドキュメントコメントを読むライブラリが動かなくなる |
PHP ファイルの数は次で数えます。複数のサイトが同じ PHP-FPM のプールを使っているなら、すべてのサイトの合計で考えます。
find /var/www -type f -name '*.php' | wc -l
設定は、FPM だけに効くファイルを追加して書きます。/etc/php/8.3/mods-available/opcache.ini は CLI と FPM の両方から読まれるため、ここでは使いません。
; /etc/php/8.3/fpm/conf.d/99-opcache-wordpress.ini
opcache.enable=1
opcache.memory_consumption=192
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=60
反映して、値が変わったことを確認します。
sudo php-fpm8.3 -t
sudo systemctl reload php8.3-fpm
php-fpm8.3 -i | grep -E '^opcache\.(memory_consumption|max_accelerated_files|revalidate_freq) '
古い記事に載っている設定に注意
| 設定 | 現在の扱い |
|---|---|
opcache.fast_shutdown |
PHP 7.2.0 で削除。書いても効果はない(同等の処理は自動で行われる) |
opcache.cache_id |
Windows 専用。同じユーザー・同じ SAPI で同じ ID を持つプロセスがキャッシュを共有するための設定で、エラーのあったファイルの扱いとは関係ない |
opcache.enable_cli=1 |
CLI の処理は1回ごとに終わるため、通常は速くならない。既定の 0 のままでよい |
ファイルの更新チェック(validate_timestamps)
opcache.validate_timestamps=1(既定)では、revalidate_freq 秒ごとにファイルの更新日時を確かめ、変わっていれば読み直します。revalidate_freq=60 にすると、ファイルを書き換えてから最大60秒は古いコードが動く代わりに、確認の回数が減ります。
opcache.validate_timestamps=0 にすると確認そのものをしなくなりますが、ファイルを書き換えても、キャッシュをクリアするまで古いコードが動き続けます。WordPress では次の点に注意します。
- 管理画面からのプラグイン・テーマ・本体の更新では、WordPress(5.5 以降)がコピーしたファイルのキャッシュを
wp_opcache_invalidate()で無効にします。この処理は Web のプロセスで動くので、PHP-FPM のキャッシュに効きます。 - WP-CLI(
wp plugin updateなど)で更新した場合、無効化は CLI のプロセスで行われるため、PHP-FPM のキャッシュには届きません。 git pull・rsync・FTP などでファイルを置き換えた場合も、キャッシュは自動では消えません。
validate_timestamps=0 は、デプロイの手順に PHP-FPM の再読み込みを組み込める場合だけにし、それ以外は 1 のまま revalidate_freq を調整するのが安全です。
キャッシュをクリアする
PHP-FPM のキャッシュを消すには、PHP-FPM を再読み込みするのが簡単です。
sudo systemctl reload php8.3-fpm
デプロイの最後や、WP-CLI で更新したあとにこのコマンドを実行します。wp eval 'opcache_reset();' や php -r 'opcache_reset();' は、前に書いたとおり CLI のキャッシュを消すだけです。
シェルを使えない共用サーバーでは、Web 経由で opcache_reset() を呼ぶ必要があります。ただし、多くの共用サーバーでは opcache.validate_timestamps=1 のまま運用されているため、通常はファイルを置き換えれば revalidate_freq 秒以内に反映されます。設定値はサーバー会社の管理画面や phpinfo() で確認してください。
JITはWordPressで使うべきか
PHP 8.0 から、OPcache には JIT(実行時にネイティブコードへ変換する機能)があります。PHP のバージョンで既定値が違います。
| PHP | opcache.jit の既定 |
opcache.jit_buffer_size の既定 |
結果 |
|---|---|---|---|
| 8.0〜8.3 | tracing |
0 |
バッファが0なので JIT は動かない |
| 8.4 以降 | disable |
64M |
JIT は動かない |
どちらの場合も、既定のままでは JIT は使われません。JIT は計算の多い処理に向いた仕組みで、データベースやファイルの読み書きが中心の WordPress では効果が小さい傾向があります。試すなら、ステージング環境で次のように有効にし、応答時間を測って比べてから本番に入れます。
opcache.jit=tracing
opcache.jit_buffer_size=64M
JIT を有効にすると、opcache.memory_consumption に加えて jit_buffer_size 分の共有メモリを使います。