Affamative Way

前向きにグダグダいいながらコード書く

セッションファイルを分散して保存する方法

phpのセッションファイルを分散するには以下の方法を用いる
PHP: セッション - Manual

オプションの引数としてN(数値)を指定できます。 これはセッションファイルを分散して保存する際に ディレクトリ階層レベルを決定します。 例えば、'5;/tmp'とすると /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If という位置にセッションファイルを生成します。

何で階層化するかというと、それはこの辺を参考*1
phpのセッションをファイルにためる場合はディレクトリを分散させる話




んで

Nを使用するには、これらすべてのディレクトリが 事前に作成されている必要があります。 そのためのシェルスクリプトがext/sessionに mod_files.shというファイル名であります。

事前にディレクトリがないといけないというわけですよ。
ということでwin用がなくて不便だったので、PHPで書いて見た。

<?php
/* Sessionのディレクトリ作成スクリプト */

/**
 * トリガー
 *
 * @param String $parent_path セッションを保存先の絶対パス(最後に"/"を付ける)
 * @param integer $depth 作成する深さ
 */
function triger( $parent_path, $depth )
{
    _make_dir($parent_path, $depth);
}

/**
 * 再起的にディレクトリを作成するスクリプト
 *
 * @param String  $parent_path セッションを保存先の絶対パス(最後に"/"を付ける)
 * @param integer $depth 作成する深さ
 * @param integer $carrent_depth
 */
function _make_dir($parent_path, $depth, $carrent_depth = 0)
{
    if ( $depth > $carrent_depth ) {
        umask(0);
        for ($i=0; $i<16; $i++) {
            mkdir($parent_path .dechex($i) ,0777);
            _make_dir($parent_path .dechex($i) ."/", $depth, $carrent_depth + 1);
        }
    }
}

// 以下のようにphp.iniにて設定している場合
// session.save-path = "3;C:/tmp/"
triger( 'C:/tmp/', 3);

これで16 * 16 * 16 個のディレクトリが"C:/tmp/"以下できます

単純にiniからsession.save-pathを取得してもいいけど、アプリ側で保存パスしてると面倒なのであえて階層は別に持ってます。
コマンドライン使えるようにしろという話もあるが、何度も実行するもんでもないですし。

手前味噌ながら、この辺使ってやればブラウザも保存もいらないで実行できます。
PHPを手軽にテストするツール - Affirmative Way


「無駄なコード書いてんなー」等々ツッコミ大歓迎

*1:それだけユーザーくるならDBに入れろという話もある