スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

phpでセッションファイルを複数ディレクトリに分割する

phpのセッションファイルは、通常php.iniのsession.save_pathに指定されたディレクトリに、1セッション=1ファイルで保存されます。

ある程度PV数が多いサイトになると、数万〜数百万といったセッションファイルがこのディレクトリに保存されることになり、セッションファイルへのアクセスが遅くなるといった問題が発生します。

このphpのセッションファイルを複数のディレクトリに分割して保存することにより、セッションファイルへのアクセスが遅くならないようにする方法です。

  1. セッションファイルを分割保存するためのディレクトリを作成
    セッションファイルを分割保存するディレクトリを作成するスクリプトが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であってもこれらの文字が使われているためです。
  2. php.iniのsession.save_pathを変更する
    session.save_pathで分割ディレクトリを使用するための書式は'階層;分割ディレクトリのパス'です。分割ディレクトリを/var/lib/php/div_session、階層を3とすると、以下のように設定します。
    session.save_path '3;/var/lib/php/div_session'
  3. webサーバを再起動する
  4. 古いセッションファイルを定期的に削除するように設定する
    セッションファイルを分割保存するように設定した場合、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

関連記事

テーマ : プログラミング
ジャンル : コンピュータ

tag : PHP

コメントの投稿

非公開コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
プロフィール
arapeeeです。
かれこれ15年ほどIT業界で働いているため、それなりの経験、知識はあるはず。
仕事や趣味で知ったIT系の雑多なTipsをメモっていきます。
月別アーカイブ
最新記事
カテゴリ
最新コメント
最新トラックバック
カウンター
検索フォーム
ブログランキング
ランキングに参加しています

人気ブログランキングへ

ブログランキング・にほんブログ村へ

Amazon人気商品