PHPのセッションファイルをcronでガベージコレクション

PHPのセッションファイルも、ずっと削除していないとゴミファイルだらけになってしまうので、何かしらのタイミングでガベージコレクションが必要になります。このページでは、cronを使用して非同期でガベージコレクションを行う方法を解説します。

もくじ

  • セッションの設定の確認
  • ガベージコレクション用のコマンドの作成
  • cronの設定

セッションの設定の確認

まずはphp.iniを開き、セッションについての設定を確認しましょう。チェックすべきなのは、
  • session.save_path(セッションファイルを保存する場所のパス)
  • session.gc_maxlifetime(セッションファイルの寿命)
  • session.gc_probabilityとsession.gc_divisor(PHPでsession_start()が呼ばれた時にガベージコレクタが起動する確率の設定 session.gc_probability/session.gc_divisor で計算できる)
この4つになります。session.gc_probability=1,session.gc_divisor=1000とすると、session_start()が呼ばれた時に1000分の1の確率でガベージコレクションが実行されますが、これをやるとガベージコレクションの時にPHPの実行時間が長くなります。なので、サイトがある程度の規模になったら、ガベージコレクションは非同期で行うようにするべきです。非同期にするなら、session.gc_probabilityの値を0にして、PHPでのガベージコレクタ召喚を止めます。話がそれましたが、セッションファイルの保存されているパスとセッションファイルの寿命はこの後の設定で使うので、どこかに控えをとっておきましょう。

ガベージコレクション用のコマンドの作成

さあ、ガベージコレクション用のコマンドを作成していきましょう。なお、セッションファイルは/tmpに保存してあるものとします。皆様の環境に合わせて置き換えてください。

PHPで生成されるセッションファイルは、ファイル名がsess_で始まります。というわけで、

findコマンドで、まずはセッションファイルを検索します。

しかし、このままでは削除コマンドがありませんし、寿命が残っているセッションファイルまで一網打尽にしてしまいます。まずは寿命が切れたファイルだけ抽出します。コマンドが以下のように変わります。

-mmin +20で、最終更新時刻が20分以上前のものを抽出しています。セッションの寿命よりも少し長めにしておくのが安全だと思います。

ここまで来たら、抽出された寿命切れセッションファイルを削除するだけです。コマンドはこんな感じになります。

xargsは、標準入力から受け取った文字列を、引数として指定されたコマンドに渡します。上の例では、findコマンドで抽出したセッションファイルのリストを引数としてrmコマンドに渡しています。これで寿命切れセッションファイルの一括削除コマンドは完成です。

cronの設定

最後に、完成したコマンドをcronで定期的に実行するようにしましょう。 で、cronの設定(root権限で実行するもの)を編集できます。セッションファイルが各ユーザーを所有者として生成されているのであれば、各ユーザーごとにcronを設定(vim /var/spool/cron/ユーザー名 で編集可能)してもいいと思います。追記するのはこんな感じです。 上の例では、3時間に1回、実行時は7分になったらガベージコレクションが起動します。プロセス優先度・ディスクI/O優先度を下げてあります。状況に合わせて適切に設定しましょう。

このブログを応援する・寄付する

当ブログでは暗号通貨による寄付を募っております。

Bitcoin:

Monacoin:

Litecoin: