リロードするとFatal error: Call to undefined **となる問題
【問題】リロード時にUndefined Errorとなる
APCのオペコードキャッシュを有効化した時、サーバーを立ち上げると最初は表示されるものの、リロードすると「Fatal error: Call to undefined **」となってしまう。
apc.iniの以下の部分を「apc.enable_opcode_cache=1」とすると上記の現象になる。
; This can be set to enable the APC opcode cache
; WARNING: don't set this option if another opcode cache is enabled
apc.enable_opcode_cache=0
環境は、nginx + PHP 5.4.28(php-fpm) + APC(3.1.15dev beta)です。
【原因】APCのエラー
エラー回避の方法を調べていくと、どうやらAPCの特定バージョンで起きる不具合だったよう。詳細な再現条件は調べてないので不明ですが、APC(3.1.15dev beta)では上記不具合が起きていました。
サーバー立ち上げ時にオペコードキャッシュがAPCによって作成され、リロード時は生成されたキーを元にオペコードキャッシュを呼ぼうとするが、そこでこけてしまいFatal Errorとなるようです。
▼参照 PHP :: Bug #61219 :: method not found on 2nd request Upgrade to PHP 5.4 from PHP 5.3 - undefined method SWIFT_License::DecodeKey()
【解決策】Zend OPCacheを導入する
パッチを当てれば直るらしいのですが、オペコードのキャッシュはZend OPCacheにすることにしました。ちなみに、Zend OPCacheはPHP5.5から導入されたものですが、PHP5.4でも問題なく使えます。
理由は、ざっくり以下の2点です。
・APCはすでに開発が止まっている ・Zend OPCacheのほうがパフォーマンスが良い(らしい)
Zend OPCache+APCの構成で解決
ただし、Zend OPCacheはユーザーデータのキャッシュには対応していないため、Zend OPCacheだけではWordPressのオブジェクトキャッシュが使えません。
そのため、APCはオペコードキャッシュには使わずにZend OPCache+APCという構成にすることにしました。
もしパッチを当てて直したいという人は、こちらのパッチを参照してみてください。
[amazonjs asin=“4844362526” locale=“JP” title=“WordPress 高速化&スマート運用必携ガイド”]