APCによるWordPressの管理画面にログインできない障害

WordPressサイトを構築していて、インストール直後に通常アクセスはできるのに、ログインページからログインすると画面が真っ白になってログインできない症状に出くわしたので、その解決方法を備忘録として残しておこうかと。

Codexに上記のケーススタディが載っていたのだが、該当する原因や解決方法がなかったので、エラーログを確認してみた。
[code light=”true”] PHP Fatal error: Call to undefined function get_option() in /var/www/html/wp-admin/admin.php on line 32, referer: http://******/wp-login.php[/code]
と、出ている。エラーでは管理画面の本体 admin.php にて get_option 関数が定義されていないと言っている。ちなみに、インストールしたWordPressのバージョンは3.4.1(2012年8月29日時点最新)である。

今度はマニュアルサイトで関数を確認すると get_option() は wp-includes/functions.php で定義されているとのこと。そこで、wp-admin/admin.php のソースを追ってみると、30行目で wp-load.php が require_once されていた。wp-load.php では、48行目で load.php が require_once されており、その後で wp_load_translations_early() がコールされている。
load.php の668行目で定義されている wp_load_translations_early の関数内で、該当の functions.php が require_once されているので、このインクルード処理前に return されてしまっている可能性があるのでは…と思い調査してみた。
だが、いくら変数をvar_dumpしてみてもわからずじまい…うぅむ、困った。

──そこで、ネットで同じような症状がないかを調べてみたら、ありました。
本家英語版のWordPressフォーラムに同じエラーでハマッてる人の解決方法が書いてありました。
いやぁ、最初からネットで探してれば苦労はしなかったものを…。

//wordpress.org/support/topic/wp-301-apc-314-php-533-white-wp-adnmin-page

APC(Alternative PHP Cache)というPHPアクセラレータが悪さをしている模様。
APC自体は、コンパイルされたPHPファイルをキャッシュしてPHPの動作を早くするアクセラレータモジュールで、デフォルトインストールの状態でも体感速度に差が出る程の凄いヤツらしい。そもそも今回のような不具合は、APCが悪いわけではなく、APCの設定がWordPress用に最適化されていないための問題というのが実態のようだ。

と言うわけで、構築サーバ(CentOS 5)を調べてみたら、確かにAPCがインストールされていた。APCの情報を確認するため、
[code lang=”shell” light=”true”]ln -s /usr/share/pear/apc.php /var/www/html/apc.php[/code]
…とドキュメントルートにシンボリックリンクを作ってアクセスしてみると、APCのバージョンは3.1.9(ちなみにPHPのバージョンは5.3.16)。

さて、ここからは解決方法の手順です。

  1. まずAPCの設定ファイル(/etc/php.d/apc.ini)を開き、設定「apc.include_once_override」をオフにします。
    [code lang=”php” light=”true”]apc.include_once_override=0[/code]
  2. もし、上記の設定ファイルがphp.dにない場合は、
    [code lang=”shell” light=”true”]echo "extension=apc.so" > /etc/php.d/apc.ini[/code]で作成して、1.の設定を追記してください。
  3. Apacheを再起動します。
    [code lang=”shell” light=”true”]apachectl graceful[/code]もしくは[code lang=”shell” light=”true”]service httpd restart[/code]

これで、正常にWordPressの管理画面にログインできるようになりました。

インストール先の環境によってWordPressの挙動も様々だなぁ…と改めて感じたケーススタディだった。
もし今度、同じような状況に陥ったら、まずはAPCのインストール状況を調べるべきだな…。

おすすめ記事