SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】セッションファイルが大量に発生する場合

問題

phpのセッションファイルが大量に生成されているシステムがあり、/tmp 直下に何万個もファイルがあるのはよろしくないような気がするのですが、何か改善できないでしょうか。

ファイルベースのセッションをやめてmemcachedやデータベースへ格納したいところですが、そうもいかない場合…

答え

phpの標準機能で、何階層かディレクトリを作って、その中にセッションファイルを格納することができる。

1、セッションの保存場所とディレクトリを何階層作るか指定する

php.ini か、.htaccess で以下のように設定する。

session.save_path = "2;/セッション/保存用/ディレクトリ"

設定ファイルではなくプログラムで対応する場合は、session_start() する前に、以下を実行するようにプログラムを変更する。

session_save_path("2;/セッション/保存用/ディレクトリ");

2、セッションの保存場所を作る

セッションの保存場所になる何階層かのディレクトリは、勝手に作られるわけではないので、自分で作っておく。

ソースからインストールしている場合は、それ用のツールがその中にある。 → ext/session/mod_files.sh

/bin/sh ext/session/mod_files.sh /セッション/保存用/ディレクトリ 2 4

上は、「/セッション/保存用/ディレクトリの中に、ディレクトリを2階層作る。session.hash_bits_per_character は4(現在の設定値に合わせれば簡単)。」の指定。

session.hash_bits_per_character = 4 なら 0123456789abcdef の16文字を使ってディレクトリが作られるだけのことなので、手作業、もしくは自作スクリプトでも作ってもよい。

.
|-- 0
|   |-- 0
|   |-- 1
|   |-- 2
|   |-- ...
|   |-- ...
|   `-- f
|-- 1
|   |-- 0
|   |-- 1
|   |-- 2
|   |-- ...
|   |-- ...
|   `-- f
|-- 2
|   |-- 0
|   |-- 1
|   |-- 2
|   |-- ...
...

session.hash_bits_per_character = 5 なら 0123456789abcdefghijklmnopqrstuvwxyz が使われるので注意。

階層の深さはセッションファイルがどのくらい溜まるか、1フォルダに何個ぐらいにとどめたいかを考えて決めればよい。

3、セッションの定期的な削除

デフォルトなら、一定の確率でセッションファイルの削除が自動で発動してくれるが、session.save_path にディレクトリの深さを指定すると、自動での削除は発動しなくなる。

自分でセッションファイルを定期的に削除しなくてはならなくなる。

簡単には、tmpwatchをcrontabで1日1回実行して消すなどで。ディレクトリを消すと自動再作成されないので、ディレクトリは消さないように。

tmpwatch -dm 24 /セッション/保存用/ディレクトリ

関連するメモ

コメント