phpでセッションファイルを複数ディレクトリに分割する
phpのセッションファイルは、通常php.iniのsession.save_pathに指定されたディレクトリに、1セッション=1ファイルで保存されます。
ある程度PV数が多いサイトになると、数万〜数百万といったセッションファイルがこのディレクトリに保存されることになり、セッションファイルへのアクセスが遅くなるといった問題が発生します。
このphpのセッションファイルを複数のディレクトリに分割して保存することにより、セッションファイルへのアクセスが遅くならないようにする方法です。
-
セッションファイルを分割保存するためのディレクトリを作成
セッションファイルを分割保存するディレクトリを作成するスクリプトがphpのソースツリーの中のext/session/mod_files.shです。(http://svn.php.net/viewvc/php/php-src/trunk/ext/session/からダウンロードできます)
mod_files.shの使い方は以下の通りです。
# mod_files.sh basedir depth version
basedirは分割ディレクトリを作成するディレクトリを指定します。
depthは分割ディレクトリの階層を数値で指定します。例えば3を指定すると、basedirで指定したディレクトリの下にa/b/cといった感じに3階層のサブディレクトリを作成します。
versionにはphpのバージョンを指定します。これは、上記の分割ディレクトリの階層はセッションIDの先頭からの文字を順にディレクトリ名としたディレクトリになっているのですが、このセッションIDに使う文字がphpのバージョンごとに異なっているため、それにあわせたバージョンを指定します。
例えば、セッションIDがabcdefghijklmnの場合、a/b/c/のディレクトリ内にセッションファイルが保存されることになります。
このバージョンの指定ですが、php 5.xを使用している場合でも6を指定したほうがいいです。というのは、w、x、y、zおよび英大文字のディレクトリはバージョン6を指定しないと作成されないのですが、実際にphpが割り振るセッションIDでは、php 5.xであってもこれらの文字が使われているためです。 -
php.iniのsession.save_pathを変更する
session.save_pathで分割ディレクトリを使用するための書式は'階層;分割ディレクトリのパス'です。分割ディレクトリを/var/lib/php/div_session、階層を3とすると、以下のように設定します。
session.save_path '3;/var/lib/php/div_session' - webサーバを再起動する
-
古いセッションファイルを定期的に削除するように設定する
セッションファイルを分割保存するように設定した場合、phpによるセッションファイルのガベージコレクションが機能しなくなるため、古いセッションファイルを定期的に削除するようにcrontabに設定する必要があります。
以下のようなコマンドが定期的に実行されるようにしてください。
/find /var/lib/php/div_session/ -mtime +7 -type f -delete
このコマンドの例では、/var/lib/php/div_session/以下で8日以上修正のないファイルを削除します。
phpのマニュアルのphp.iniの説明のところに、分割ディレクトリの設定方法が書かれています。http://jp.php.net/manual/ja/session.configuration.php#ini.session.save-path
- 関連記事
- PHP 5.3.xからMySQLに接続できない (03/02)
- phpでセッションファイルを複数ディレクトリに分割する (03/10)
- Windows環境のPHPからメールを送信 (03/22)
tag : PHP

