[APC] リロードすると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という構成にすることにしました。

もしパッチを当てて直したいという人は、こちらのパッチを参照してみてください。

コメントを残す

メールアドレスが公開されることはありません。