ガベージコレクション(GC)をCakePHPで試してみる

目的

忘れやすいし、メモ。

使ってるのはCakePHP2.5.1

そのそもガベージコレクションとは??

こちらの方の説明が一番完結でわかりやすかったです。

PHPセッションのGC – まつぼ x Web

Sessionファイルがバカにみたいに多くなってしまうと、重くなるので消しましょうってことです。

上記リンクサイトさんではphp.iniで設定を変更し、cronで処理してましたが、今回こちらではCakePHPで設定していきたいと思います。

core.phpで色々設定

先に今回設定してみたcore.phpの設定です。とりあえずやりたいこととしては、ガベージコレクション以外にはCakePHP使ってますよというのを隠したい。ブラウザを閉じたらセッションを切りたい。あとはガベージコレクションを使って無駄なセッションファイルは排除していきたい。まとめると、

  • cookieの名前を変更
  • ガベージコレクションを使っていらないセッションのファイルを削除

という感じです。

今回設定したのはこんな感じです。

設定項目を説明

指定できるものは、’php”, cake’, ‘cache’です。
‘php’はサーバーにあるPHPの設定通り動きます。phpinfo()などで確認できますが、おそらく/var/lib/php/session/以下にsess_で始まるファイルが格納されてるハズです。
‘cake’の場合は、/app/tmp/sessions/以下に同様のファイルが格納されます。
‘cache’の場合は、キャッシュ内のセッションをAPC、memcacheのように格納することができるようになります。

これはそのまま、セッションが切れる時間を指定できます。注意するのはtimeoutは分単位になることです。

これはクッキー名を変更できます。デフォルトはCAKEPHPなので、あからさまにcakephpですよとアピールしてることになっちゃいますね。まあ、これだけで隠蔽できるわけじゃないですけど、必要とあれば変えられます。

iniで設定できるのはphp.iniの設定を上書きできます。

session.cookie_lifetime => 0はブラウザを閉じた時にクッキーが消えるようにクッキーの持続時間を0秒に設定しています。

session.gc_maxlifetime => 21600はガベージコレクションがどれくらいは発動するかをしていしている。この場合、timeoutで指定した時間よりも短い場合は、正常に動かないことがある。正常というか、現在のセッションを消しちゃう可能性があるってことなのかな?

session.gc_probability => 1 はガベージコレクションが起動する確立の分子。

session.gc_divisor => 100 はガベージコレクションが起動する確立の分母。

以上で、360分毎に100分の1の確立でガベージコレクションが発動してsess_で始まるファイルが消えます。

注意点

PHPの場合は、サーバー内のアプリケーションは1つのPHPを共有しますので、/var/lib/php/session以下のsessionが消えるとサーバー内のPHPアプリケーションのセッションが同じ様に処理されちゃうみたいです。(未検証です。)

なので、そこが問題だという場合は何か対策が必要かもしれません。

SNSでもご購読できます。

コメントを残す

*