たぶん忘れるメモ

記憶力はないのです。

PHPでmemcached のセッション管理をする

PECL::memcache と PECL::memcached について調べた

(2011.5.14現在)

PECL::memcache

http://pecl.php.net/package/memcache

安定版は v2.2.6。

PHP4.3.3以上で使用可能。
古くから対応しているだけあって、php.iniの設定項目も比較して多い。

memcache.hash_strategy=consistent

これをしておくと、再マッピング不要になる。
サーバーを複数設定したり、追加削除が想定される場合はこっちにしない理由がなさそう。

PECL::memcached

http://pecl.php.net/package/memcached

安定版は v1.0.2。

phpのマニュアルを見た感じだと、こっちのほうがメソッドが多い。
ただ、libmemcached に依存しているのでインストール面倒くさそうな感じ。
PHP5.2.0以上が必須要件。

http://alpha.mixi.co.jp/blog/?p=119
こちらを読んだり、グーグルさんに教えてもらった辺りをさまよってみた感じだと、libmemcached を利用していることによる拡張点が魅力になるのかな。
分散とか考えないなら…なんて、実際の運用ではないので、memcache の魅力をもっと生かしたいなら、こっちなのかもしれない。

PECL::memcache で session する

memcached インストール
$ wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
$ tar zxvf memcached-1.4.5.tar.gz
$ cd memcached-1.4.5
$ ./configure
$ make
$ make install

# 入ってなかったらインストール
# 開発版じゃないとダメ
$ yum install -y libevent-devel

# 確認
$ rpm -ql libevent-devel

# 起動
$ memcached -d -m 64 -p 11211

-d デーモンモードで
-p メモリ
-p ポート

session につかうなら -C オプションを追加(=CASを使用しない、に)すると少食になるらしい。

php での設定の仕方

PECL::memcache をインストールする。

インストールする環境のPHPが v5.1.6だったので、ついでに v5.2.17にして、静的に組み込んでみる。
公式リファレンスを見て、そのまんま。
http://www.php.net/manual/ja/install.pecl.static.php

$ cd ext
$ wget http://jp.php.net/get/php-5.2.17.tar.gz/from/this/mirror
$ tar zxvf php-5.2.17.tar.gz
$ cd php-5.2.17/ext
$ gzip -d < memcache-2.2.6.tgz | tar -xvf -
$ mv memcache-2.2.6 memcache
$ cd ..
# チキンなので退避
$ mv configure configure.org
$ ./buildconf --force
# なんかいっぱいWarning出たけど見なかったことにする
$ ./configure --help | grep memcache

# --enable-memcache がいたから成功?

$ ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs
            --enable-force-cgi-redirect --enable-mbstring --enable-mbregex
            -with-mysql --enable-memcache
$ make
$ make install

configure オプションはいつもの感じのに --enable-memcache を追加したもの。
入ったっぽいので、適当なスクリプトを書く。

<?php
$mem = memcache_connect('localhost', 11211);

// for object
$mem->add('key_dayo', 'item_dayo', false);
echo $mem->get('key_dayo');
echo "\n";

予想通りの結果が出力されればOK、のはず。

既にPECL::memcacheがインストールされていれば、移行でも再起動しなくて ini_set() 指定でどうにかなる。

extension=php_memcache.so

session.save_handler=memcache
session.auto_start=0
session.save_path={ホスト:ポート}

PECL::memcached 使用の場合は、extension と session.save_handler を memcached に変更。

memcache の場合は、session.save_path にtcp:// をつける、とあるけど、なくても動いた。
IP指定だから?

確認

既にSessionを使用しているアプリとかあるなら、それを動かす。
明示的にセッションのスタートは宣言しなくちゃいけないので、なければ簡単なのを書く。

できたセッションキーをキーにして、直接 memcached に取りに行ってみる。

$ telnet localhost 11211

とりあえず、ステータス確認

$ stats
STAT pid 3028
STAT uptime 959
STAT time 1304872012
STAT version 1.4.5
STAT pointer_size 32
STAT rusage_user 0.000000
STAT rusage_system 0.013997
STAT curr_connections 10
STAT total_connections 21
STAT connection_structures 11
STAT cmd_get 10
STAT cmd_set 7
STAT cmd_flush 0
STAT get_hits 6
STAT get_misses 4
STAT delete_misses 1
STAT delete_hits 2
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 2669
STAT bytes_written 2088
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 721
STAT curr_items 2
STAT total_items 7
STAT evictions 0
STAT reclaimed 0
END

curr_items が今登録されているアイテム数。あってる?

セッションで使ってるCookieキーは cbc06e8712af44b07f927ea6e69b5d2d

$ get cbc06e8712af44b07f927ea6e69b5d2d
VALUE cbc06e8712af44b07f927ea6e69b5d2d 0 6
nakami
END

うん。OKっぽい。