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/