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 分の共有メモリを使います。

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲