tohokuaikiのチラシの裏

技術的ネタとか。

CentOS5(64bit)にPHP5.3を入れてMemcachedを使うようにしたかったのでメモ

PHPに存在する2つのmemcacheモジュール

PHPには、memcahcedと対話する2つのExtensionモジュールがある。MemcacheMemcachedである。

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
      • > Package perl-EV.x86_64 0:4.03-1.el5.rf set to be updated
    • > Processing Dependency: perl(common::sense) for package: perl-EV
      • > Package perl-Guard.x86_64 0:1.021-1.el5.rf set to be updated
      • > Package perl-JSON.noarch 0:2.50-1.el5.rf set to be updated
      • > Package perl-JSON-XS.x86_64 0:2.30-1.el5.rf set to be updated
      • > Package perl-Net-SSLeay.x86_64 0:1.30-4.fc6 set to be updated
    • > 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
      • > Package perl-common-sense.x86_64 0:3.0-1.el5.rf set to be updated

って依存性いっぱい。

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

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でセッションをmemcachedに持たしてみる。

<?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で接続するってこと。

*1:当然のように勘違いしてハマりました

*2:本当はmemcachedを入れたかったのだけど間違えた。