PHPに存在する2つのmemcacheモジュール
PHPには、memcahcedと対話する2つのExtensionモジュールがある。MemcacheとMemcachedである。
memcachedの方が後発で機能も豊富らしい。Igbinaryという文字列ではなくてバイナリ形式でのシリアライズ方式もサポートしている。
http://www.jqueryin.com/2011/04/19/php-memcache-vs-memcached/
http://stackoverflow.com/questions/1442411/using-memcache-vs-memcached-with-php
ただし、memcachedはPHP5.2以上でないと使えないのとlibmemcachedライブラリが必要みたい。まぁ、パッケージマネージャ使ってれば面倒な話ではないんでしょうけど。
Peclパッケージを見ると、どちらも同じくらいの開発の勢い。
http://pecl.php.net/package/memcache
http://pecl.php.net/package/memcached
どっちを使ってもいいけど、ややこしいので間違わないように。*1
自分はmemcacheを使いました。*2
php-memcache
どうもPHP53の64bit版が無いようなので、ソースから入れる
wget -O php-pecl-memcache.tgz http://pecl.php.net/get/memcache tar xvzfmp php-pecl-memcache.tgz cd memcache-3.0.6/ phpize make ./configure make make install
途中でzlib-develが無いと言われたので追加でインストールした。
そのあとphp.iniに
extension_dir = "/usr/lib64/php/modules"
extension=memcache.so
を入れる。
# php -m |grep memcache
memcache
memcachedをいれる
これも普通にダウンロードできないので、rpmforge-extrasのリポジトリを追加してrpmforgeを有効にする。
more /etc/yum.repos.d/rpmforge.repo # Name: RPMforge RPM Repository for Red Hat Enterprise 5 - dag # URL: http://rpmforge.net/ [rpmforge] name = Red Hat Enterprise $releasever - RPMforge.net - dag #baseurl = http://apt.sw.be/redhat/el5/en/$basearch/dag mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge #mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge enabled = 0 protect = 0 gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag gpgcheck = 1 [rpmforge-extras] name = RHEL $releasever - RPMforge.net - extras baseurl = http://apt.sw.be/redhat/el5/en/$basearch/extras mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge-extras #mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge-extras enabled = 0 protect = 0 gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag gpgcheck = 1
とりあえず、rpmだけダウンロードする
なんでダウンロードだけかというと、あとで別のrpmforgeが使えないサーバに持って行ってサーバ業者にお願いするからです。
yum --downloadonlyを使いたかったのだけど、これはyum-downloadonlyというパッケージが必要なので、
yum install -y yum-downloadonly yum --enablerepo=rpmforge-extras install --downloadonly memcached || ・・・ところが、perl-AnyEventが無いよって言われる。なければ自動的に引っ張ってきてほしいんだけど、 >|sh| yum install -y --downloadonly --enablerepo=rpmforge-extras perl-AnyEvent
ってしてもエラーが出る。
- > Running transaction check
- > Package perl-AnyEvent.noarch 0:5.240-1.el5.rf set to be updated
- > Processing Dependency: perl(JSON) >= 2.09 for package: perl-AnyEvent
- > Processing Dependency: perl(JSON::XS) >= 2.2 for package: perl-AnyEvent
- > Processing Dependency: perl(EV) >= 3.05 for package: perl-AnyEvent
- > Processing Dependency: perl(Net::SSLeay) >= 1.33 for package: perl-AnyEvent
- > Processing Dependency: perl(Guard) >= 1.02 for package: perl-AnyEvent
- > Processing Dependency: perl(Net::SSLeay) for package: perl-AnyEvent
- > Running transaction check
- > Package perl-AnyEvent.noarch 0:5.240-1.el5.rf set to be updated
- > Processing Dependency: perl(Net::SSLeay) >= 1.33 for package: perl-AnyEvent
- > Processing Dependency: perl(common::sense) for package: perl-EV
- > Running transaction check
- > Package perl-AnyEvent.noarch 0:5.240-1.el5.rf set to be updated
- > Processing Dependency: perl(Net::SSLeay) >= 1.33 for package: perl-AnyEvent
って依存性いっぱい。
perl-AnyEventが必要なんだけど、これに必要なのが
perl(JSON)
perl(JSON::XS)
perl(Net::SSLeay)
perl(Guard)
perl(EV)
と
ただ、perl(EV)に必要なのが
perl(common::sense)
なので、順番としては
yum install -y --downloadonly --enablerepo=rpmforge perl-common-sense yum install -y --downloadonly --enablerepo=rpmforge perl-EV yum install -y --downloadonly --enablerepo=rpmforge perl-Guard yum install -y --downloadonly --enablerepo=rpmforge perl-Net-SSLeay yum install -y --downloadonly --enablerepo=rpmforge perl-JSON yum install -y --downloadonly --enablerepo=rpmforge perl-JSON-XS yum install -y --downloadonly --enablerepo=rpmforge perl-AnyEvent
という感じか。でこれらを全部rpm -ivh でインストール
perl-Net-SSLeayはbaseリポジトリにあった。
・・・・が、これ1.30で、1.33以上が必要なのでrpmforge-extrasからダウンロードする
yum install -y --downloadonly --enablerepo=rpmforge-extras --disablerepo=base perl-Net-SSLeay rpm -e perl-Net-SSLeay rpm -ivh perl-Net-SSLeay-1.36-1.el5.rfx.x86_64.rpm
ここまでやってようやく
yum install -y --downloadonly --enablerepo=rpmforge perl-AnyEvent
でダウンロードできるようになった。でインストール。
さてようやくmemcachedが行けるかと思いきや
yum install -y --downloadonly --enablerepo=rpmforge-extras memcached
Resolving Dependencies
- > Running transaction check
- > Processing Dependency: perl(YAML) for package: memcached
- > Processing Dependency: perl(Term::ReadKey) for package: memcached
- > Finished Dependency Resolution
memcached-1.4.7-1.el5.rfx.x86_64 from rpmforge-extras has depsolving problems
--> Missing Dependency: perl(Term::ReadKey) is needed by package memcached-1.4.7-1.el5.rfx.x86_64 (rpmforge-extras)
memcached-1.4.7-1.el5.rfx.x86_64 from rpmforge-extras has depsolving problems
--> Missing Dependency: perl(YAML) is needed by package memcached-1.4.7-1.el5.rfx.x86_64 (rpmforge-extras)
と依存性エラー
yum install -y --downloadonly --enablerepo=rpmforge perl-YAML yum install -y --downloadonly --enablerepo=rpmforge perl-Term-ReadKey
ここまで来て、ようやくダウンロードできた。
あー、長かった・・。ここまでやってなんだけど、なんか、rpmforgeじゃなくてremi使うとイイっぽい。
で、起動させておく
/etc/init.d/memcached start # Distributed memory caching (memcached) を起動中: [ OK ] chkconfig memcached on chkconfig --list|grep mem # memcached 0:off 1:off 2:on 3:on 4:on 5:on 6:off
こんな感じ。
とりあえず使ってみる
<?php $session_save_path = 'tcp://localhost:11211'; if (ini_set('session.save_handler', 'memcache') && ini_set('session.save_path', $session_save_path)){ session_start(); var_dump(++$_SESSION['counter']); }
$session_save_path = "tcp://$host:$port1?persistent=1&weight=2&timeout=2&retry_interval=10,tcp://$host:$port2";
というように複数のmemcachedサーバに繋ぐこともできる。persistent=1は多分pconnectで接続するってこと。