PHP APCuをインストールしてWordPressのobject-cache.phpを配置

PHPのAPC, APCu, OPcacheに関しての知識を整理したときの覚書。
Gemini 3 Pro Previewと対話

環境: FreeBSD , PHP 8.3.26, WordPress 6.9.0


1. APCuとは?

APCu は、PHPで動くインメモリの key-value ストア。
APCu(APC User Cache) は APC(Alternative PHP Cache)からOPcach機能を除いたもの。
参考: PHP: はじめに - Manual

APCからAPCuになるまでの経緯

  • PHP 4.x 〜 PHP 5.4: APCがOpcode Cache(コードのキャッシュ)とUser Cache(データのキャッシュ)の両方の機能を担う。
  • PHP 5.5: 2013年にコードのキャッシュ(Opcode Cache)はPHP本体に標準で組み込まれる。
  • PHP 5.5以降 : APCから不要になったOpcode Cache機能を削除し、User Cache機能(データ保存)だけを切り出して軽量化・最新化したAPCuへ。


サーバーをクラスター構成で運用している場合は、ValkeyやRedisを利用する。
ValkeyやRedisを使うよりAPCuの方が通信のオーバーヘッドがないので圧倒的に高速。


2. APCuとWordPressの関係

WP_Object_CacheとWP Transients APIの関係。

  • WP_Object_Cache: ページ生成中の一時的なデータ保持。
    スレッドメモリに保存しページ表示後に破棄される。
    APCuを導入すると共有メモリに保存しページ表示後に破棄されず再利用可能。
  • WP Transients API: 有効期限がある長期間のデータ保持。
    データベース(wp_options)に保存。
    APCuを導入するとWP_Object_Cache経由でデータ取得保存するようになる。
object-cache.phpはWP_Object_Cacheクラスを上書きして、データを保存する際にapcu_*関数を使って共有メモリに保存する。

WordPressはwp-includes/load.php:wp_start_object_cache()でobject-cache.phpを読み込んでいる。


3. APCuのインストール。

pkg経由でインストール。
# pkg search php83-pecl
# pkg install php83-pecl-APCu

読み込まれるiniファイルを確認して編集する。
# php --ini
# vim /usr/local/etc/php/ext-20-apcu.ini

extension=apcu.so

; ----------------------------------------------------------------------
; APCu (APC User Cache) 設定
; ----------------------------------------------------------------------

; APCuを有効にするかどうか
; 1 = 有効 (デフォルト) / 0 = 無効
apc.enabled=1

; ----------------------------------------------------------------------
; メモリ設定 (最重要)
; ----------------------------------------------------------------------

; キャッシュに割り当てる共有メモリのサイズ
; デフォルトは32Mですが、WordPressでは不足しがちです。
; サーバーのメモリに余裕があれば 64M または 128M を推奨します。
; (M = メガバイト, G = ギガバイト)
apc.shm_size=256M

; ----------------------------------------------------------------------
; 有効期限 (TTL) 設定
; ----------------------------------------------------------------------

; キャッシュエントリの有効期限(秒)
; 0 にすると「明示的に消されるまで」あるいは「メモリが溢れるまで」永続します。
; WordPressのAPCuプラグイン側で制御するため、基本は 0 でOKです。
apc.ttl=0

; ガベージコレクション(掃除)の猶予時間(秒)
; キャッシュがいっぱいで古いデータを消す際、この秒数以上アクセスがないデータを消します。
; デフォルト: 3600 (1時間)
apc.gc_ttl=3600

; ----------------------------------------------------------------------
; 高度な設定・トラブルシューティング
; ----------------------------------------------------------------------

; PHPのCLI(コマンドライン)版でAPCuを有効にするか
; 0 = 無効 (推奨: 不要なトラブルを避けるため)
; 1 = 有効 (WP-CLI等でキャッシュ操作をしたい場合など)
; ※CLIとWebサーバーはメモリを共有しないため、CLIで有効にしてもWeb側は速くなりません。
apc.enable_cli=0

; スクリプトごとのキャッシュ実行時間の制限(秒)
; この時間を超えてキャッシュ操作をした場合、強制終了せずエラーを返します。
; デフォルト: 0 (無制限)
apc.use_request_time=0

php-fpmを再起動。
# php-fpm -t
# service php_fpm restart

確認。
# php -i | grep apc


4. APCu Manager プラグインのインストール

object-cache.phpだけを設置するか迷ったけど、APCu Manager プラグインをインストールしてみた。
# cd /path/to/wordpress/
# wp plugin install apcu-manager

管理画面でAPCu Managerを有効化する。
wp-contentは書き込み不可なので、探してコピーする。
# find ./wp-content/plugins/apcu-manager/ -name "object-cache.php"
# cp ./wp-content/plugins/apcu-manager/assets/object-cache.php wp-content/


APCu Manager プラグインの管理画面(WP CLIページ)でPHPエラーが出るのでやっぱりアンインストールする。
# wp plugin uninstall apcu-manager

wp-content/object-cache.phpはアンインストールと同時に削除された。


5. object-cache.phpを配置

GitHubからAPCuに対応したobject-cache.phpを探してwp-contentディレクトリに配置する。
参考: l3rady/object-cache-apcu

WordPressの管理画面のツール → サイトヘルス → テスト通過 → 「永続オブジェクトキャッシュを使用中です」と表示されれば有効になっている。



▼ 関連記事