PHPを使った開発現場ではphpenvなどを使って複数のバージョンでの動作検証を行うこともあるかと思いますが、Apache上で動作させるためにはlibphp5.soなどをPHPのバージョンごとにビルドしないといけなくて辛いです。
同様に、memcachedをPHPのセッションハンドラとして設定する場合にも、memcachedのPHPエクステンションをバージョンごとにビルドする必要があります。
libphp5.soの生成に関しては情報が充実していたので、サクっといけるかとおもいきや、意外とハマってしまった上に、ネット上の解決策がほとんどなかったのでメモ。
実行環境
CentOS 6.6
phpenvは既にインストール済みであるとします。
libmemcachedのソースを取得
memcachedの2.2.0を使用するので、libmemcachedは1.0以降でなくてはいけません。普通にyum install libmemcachedすると0.31が入ってしまうので、ソースコードを取得して手動でビルドします。
$ cd /tmp
$ wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
$ tar -zxvf libmemcached-1.0.18.tar.gz
$ cd libmemcached-1.0.18
# ./configure --without-memcached && make && make install
特に問題が発生しなければ/var/local/lib/配下にlibmemcachedがインストールされるはずです。g++が必要なので、g++ command not foundとか言われたらyum install gcc-c++してください。
memcachedのソースを取得
memcachedの2.2.0でmemcached.soを生成します。今回はPHPのバージョン5.6.15に対して生成してみます。事前に5.6.15はphpenvでインストールしておいてください。
$ cd /tmp
$ wget http://pecl.php.net/get/memcached-2.2.0.tgz
$ tar zxvf memcached-2.2.0.tgz
$ cd memcached-2.2.0
$ phpenv local 5.6.15
$ phpize
# ./configure --with-php-config=/home/hogehoge/.phpenv/versions/5.6.15/bin/php-config --disable-memcached-sasl
# make
# make install
configureのオプションに--disable-memcached-saslを指定していますが、これはmemcachedでSASL認証を使用しないという宣言をしています。SASL認証を必要とする場合には他にも設定が必要になりますが、今回は範囲外になりますので記述しません。
./configureに失敗する場合
checking for libmemcached location... configure: error: memcached support require libmemcached. Use --with-libmemcached-dir=<DIR> to specify the prefix where libmemcacached headers and library are located
のようなエラーが発生してMakefileが生成されない場合には、libmemcached-develが存在しない可能性があります。別途インストールすることをおすすめします。
makeに失敗する場合
/tmp/memcached-2.2.0/php_libmemcached_compat.h:56: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘php_memcached_instance_st’
~以下省略~
のようなエラーが発生してmakeが正常に終了できない場合には、libmemcachedのバージョンが古い場合があります。上記手順の通りに1.0以上のlibmemcachedを使用することをおすすめします。特にmemcachedのバージョンが新しい場合に発生しているようです。
PHPの設定ファイルからmemcached.soを読み込む
先ほどのmake installで/home/hogehoge/.phpenv/versions/5.6.15/lib/php/extensions/fugafuga/配下にmemcached.soが生成されていますので、それぞれのバージョンのPHP設定ファイルからmemcached.soを読み込みます。
; Enable memcached extension module
extension=memcached.so
; ----- Options to use the memcached session handler
; Use memcache as a session handler
session.save_handler=memcached
session.save_path="127.0.0.1:11211"
これでそれぞれのバージョンのPHPでmemcachedをセッションハンドラとして利用できるようになるはずです。念のため、5.6.15でmemcachedモジュールが有効になっているか確認してみます。
$ phpenv local 5.6.15
$ php -m | grep memcached
memcached
良さそうですね。
備考
結構作業が前後したりしたので順番通りにやっても動かないかも。。
何か不具合あったらコメントください。
参考
http://qiita.com/hokutoasari/items/f5d7daa53db5b9540310
http://stackoverflow.com/questions/24407095/error-when-installing-pecl-memcached
https://enlook.wordpress.com/2011/07/27/howto-enabling-memcached-extension-on-php/