Posted at

phpenvによる複数バージョン下でmemcachedをセッションハンドラとして利用する

More than 3 years have passed since last update.

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を読み込みます。


/home/hogehoge/.phpenv/versions/5.6.15/etc/conf.d/memcached.ini

; 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/