PHPのセッション管理に使う箱選び 3

前回からの続き

memcached

使用したmemcachedのバージョンは1.2.1。
クライアントにはPECLのmemcache 1.62を使用。設定は初期値のまま。
GCは1/100の設定だけど、処理自体はmemcached側に任せてPHP側では何もしない。


5000リクエストくらいまでは景気が良いけど、その後どんどん遅くなっている。

最長待ち時間を見ると10000リクエスト以上が明らかにおかしい。abの結果をよく見ると10000リクエスト以上では「Failed requests」が結構ある。

失敗したリクエストの割合を出してみると、3〜5%程度が失敗するみたいだ。ただ、まんべんなく失敗するのではなく失敗する期間というのが存在するようなので、割合を出しても意味は無いような気もする。
失敗した時、PHP

Can't connect to localhost:11211, Cannot assign requested address (99)

という警告を出していた。なんか変だ。

設定など

セッションハンドラ

<?php

define('MEM_HOST', 'localhost');
define('MEM_PORT', 11211);

$GLOBALS['sess_con'] = array(null);

function open($save_path, $session_name)
{
    $con = memcache_connect(MEM_HOST, MEM_PORT);
    if ($con !== false) {
            $GLOBALS['sess_con'][0] = $con;
            return true;
    } else {
            return false;
    }
}

function close()
{
    return memcache_close($GLOBALS['sess_con'][0]);
}

function read($sess_id)
{
    $result = memcache_get($GLOBALS['sess_con'][0], $sess_id);
    if ($result !== false) {
            return $result;
    } else {
            return '';
    }
}

function write($sess_id, $sess_data)
{
    return memcache_set($GLOBALS['sess_con'][0], $sess_id, $sess_data, 0, ini_get('session.gc_maxlifetime'));
}

function destroy($sess_id)
{
    return memcache_delete($GLOBALS['sess_con'][0], $sess_id);
}

function gc($maxlifetime)
{
    return true;
}

session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');

?>

memcachedサーバへの接続リソースがreadした後にグローバル変数から消えてしまうため、配列としてグローバル変数に格納している。なんか変だ。