WP-CLIのwp core updateがobject-cache.phpを置くと出来なくなる

WordPressのWP-CLIを使ってwp core updateをしても更新しなくなったので調査したときの覚書。
Gemini 3.1 Pro Previewと対話。

環境: FreeBSD 14.3-RELEASE-p8, php 8.3.29

wp-cliのバージョン確認。
# wp cli version

WP-CLI 2.12.0


1. object-cache.phpがあると失敗する理由

WP-CLI環境ではAPCuキャッシュが使えないため、せっかく取得した最新のアップデート情報がなってしまう。

wp core updateしたときの挙動

  1. WP-CLIが起動すると、object-cache.php が存在するため、WordPressは「アップデート情報をデータベースではなく、APCu(APC User Cache)に保存するモード」に切り替わる。
  2. WP-CLIが WordPress.org のAPIに問い合わせて「新バージョンがある」という情報を取得。
  3. 取得した情報をAPCuに保存しようとするが、CLI環境のAPCuは無効化されているため、コマンド終了と同時にメモリごと消滅。
  4. 結果として、「新バージョンがある」という情報がDBにも保存されず、メモリ上からも消え去るため、何度 wp core update を実行しても「アップデート情報がない=すでに最新版である」と誤認し続けてしまう。


2.開発環境ではCLI環境でもAPCuは有効化

object-cache.phpが存在すれば、WordPressはAPCuモードになるため、設定で対応する。

iniファイル確認。
# php --ini

Configuration File (php.ini) Path: /usr/local/etc
Loaded Configuration File:         /usr/local/etc/php.ini
Scan for additional .ini files in: /usr/local/etc/php
Additional .ini files parsed:      /usr/local/etc/php/ext-10-opcache.ini,
/usr/local/etc/php/ext-18-session.ini,
/usr/local/etc/php/ext-20-apcu.ini,
/usr/local/etc/php/ext-20-ctype.ini,
/usr/local/etc/php/ext-20-curl.ini,
/usr/local/etc/php/ext-20-filter.ini,
/usr/local/etc/php/ext-20-gd.ini,
/usr/local/etc/php/ext-20-mbstring.ini,
/usr/local/etc/php/ext-20-mysqli.ini,
/usr/local/etc/php/ext-20-pgsql.ini,
/usr/local/etc/php/ext-20-phar.ini,
/usr/local/etc/php/ext-20-simplexml.ini,
/usr/local/etc/php/ext-20-xdebug.ini,
/usr/local/etc/php/ext-20-xml.ini,
/usr/local/etc/php/ext-20-zip.ini

APCuのiniファイルを編集。
APCuのインストールは前の記事を参考に。
参考: PHP APCuをインストールしてWordPressのobject-cache.phpを配置
# less /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=1

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

WP-CLIは開発環境でしか使わないので本番環境では無効のままにしておく。


▼ 関連記事