APCの導入(失敗)&エラーが起きていたので適当に直しました

zomです。 ONにはしていませんが、このサーバではAPCをインストールまでしています。 APCと言うとAlternative PHP Cacheの略称でPHPの中間コードをキャッシュすることでプログラムの動作を高速にするためのモジュールです。 インストールした時の覚書と出てきたエラーの対処法を書いておきます。

APCのインストールはpeclコマンドを用いてやると簡単ですが、peclが使えない場合はyumでサクっと入れちゃいます。 phpizeも必要らしいです。これはphp-develに包括されていますが自分はPHPインストール時にすでに導入済みなのでやっていません。 必要な人だけ実行してください。

# yum install php-pear
# yum install php-devel

apxsも必要とのことでhttpd-develもインストールします。 が、エラーが出ました。pcre-develがあるとエラーが出なくなるそうなのでこれもインストールしちゃいます。

# yum install pcre-devel
# yum install httpd-devel
# pecl install APC

これでphp.iniでapc.soを読むようにすればインストール完了です。 参考にしたサイトはこちら。 芸人社長のブログ SUNONE BLOG Wanderflow

で、APCの管理画面というのがブラウザから見れるとのことで /usr/share/pear/apc.phpに対しシンボリックリンクを貼るなりすればいいとのこと。 管理画面にログインするにはapc.phpのソースの中のパスワードを書き換えましょう、ってことだったのですが 変更するとステータスコード401を返し続けて無限ループになってしまいました。 はてさて、どうしたものか、でもAPC使う必要も今のところないし、使わないでいいかと相成ったわけです。

で、暫くの間、APCを放置していて今回PHPのバージョンを最新にし、アップデートできたことの確認をしようとした時の話です。

# yum update --enablerepo=remi
中略
Complete!
# php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/apc.so' - /usr/lib64/php/modules/apc.so: undefined symbol: pcre_exec in Unknown on line 0
PHP 5.3.16 (cli) (built: Sep  4 2012 15:23:10)
Copyright (c) 1997-2012 The PHP Group

うん、PHPは最新版になってるけど、なんかapc.soで怒られとるー。 以前会社にあるお遊び用のPCでPHP5.4にした時もそんな感じのエラーが出ていた事を思い出しました。 当時のエラーの内容は

PHP Api Version
Zend Module Api No
Zend Extension Api No

上記の環境とインストールしようとしているモジュールのバージョンの不一致でしたが、今回も似たようなものかと勝手に解釈。 つまりPHPが最新なら、APCも最新にすればいいじゃない、的な軽いノリです。まともな人は真似しちゃいけません。 ※っていうかWikipediaのPECLの項目に再コンパイル必要ってありますね。これっぽい…。

でも時すでに遅し。やっちゃったものは仕方ない!ので手順は書いておきます。 とりあえずAPCの最新版を確認します。 PECL 2012/09/05時点で3.1.13がbetaですが最新ですね。ちなみにインストールされているのは3.1.9、stableの最新のものでした。 使ってないし、3.1.13にしちゃえー(ペロッ)ってノリでやっちゃいます。

# pecl upgrade APC-beta

APC-betaとすることでbetaの最新のものでインストール/アップデートするようです。 で、オプションは全てデフォルトのまま進めて、Apache再起動して…

# php -v
PHP 5.3.16 (cli) (built: Sep  4 2012 15:23:10)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

わーい、エラー消えたったー。 って軽いノリでいろいろやっつけてしまったダメエンジニアです。皆さん真似しちゃいけません。