• ベストアンサー

セッションの破棄

お世話になります。 現在セッションを使用してのPHPプログラムのコーディングに取り組んでおりますが、 なんとなくですがセッションのことはつかめつつあります。 そこで、基本的な質問になるのですが教えてください。 1.セッションは必ず破棄しないといけないのか。 私の想像としては、一定時間(20分くらいだったような…)またはブラウザを閉じたときにセッションが破棄されるものと思っていました。 ですが、ある掲示板で 「セッションが不要になった段階でセッションを破棄してください。  これをしないとサーバ上にセッションデータ(ファイル)がたまっていきます。」 という記述を見つけました。 必ずセッションというものは破棄しないといけないのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

myaa_myuさん、こんにちは。 > 1.セッションは必ず破棄しないといけないのか。 私の想像としては、一定時間(20分くらいだったような…)またはブラウザを閉じたときにセッションが破棄されるものと思っていました。 > ですが、ある掲示板で > > 「セッションが不要になった段階でセッションを破棄してください。 >  これをしないとサーバ上にセッションデータ(ファイル)がたまっていきます。」 > > という記述を見つけました。 > 必ずセッションというものは破棄しないといけないのでしょうか。 以前、私が書き込んだ内容ですね。 誤解を招いたようで申し訳ありません。 セッションを破棄しなければ、セッションファイルがサーバ上に削除されないで どんどん蓄積されていくわけではありません。 myaa_myuさんのおっしゃるように設定により、たまったセッションファイルを 自動で削除されます。 session.gc_maxlifetime = 1440 ここで設定された秒数により、自動でセッションを破棄するまでの時間が決まります。 初期値は1440となっているので24分です。 私がスクリプト(session_destroy())によりセッションを破棄することをすすめたのは、  ・セキュリティの面  ・ごみをためないため(無駄なものは確実に消す) といった意味です。 私も詳しいわけではないので間違っているかもしれませんが、 [デフォルト] session.gc_probability = 1(分子) session.gc_divisor = 100(分母) session.gc_probability / session.gc_divisor の確立でガーベッジコネクションが実行されるとあるので、 24分で確実にセッションが自動で破棄されるわけではなく、 24分で1%の確立でセッションが自動で破棄されるという意味だと思います。 また、 [デフォルト] session.save_path = "/tmp" セッションデータを保存するパスですが、 「パスの深さが2より大きい場合、ガーベッジコレクションは行われません。」 とマニュアルにあるので、 /tmp/tmp2/tmp3 となっていると自動での破棄を行わなくなる という意味だと思います。 なので、設定で大きく左右されるので頼りっきりにするのではなく、 自分自身で必要がなくなったと判断した時点で削除するというようにした方がよいと思っています。 私のマニュアルの解釈が間違っているかもしれませんので、 私自身、詳しい方のご意見を伺いたいです^^; 【参考】 http://jp.php.net/manual/ja/ref.session.php http://www.stackasterisk.jp/tech/php/php03_06.jsp;jsessionid=aCXqtz5vDdDg http://www.hizlab.net/app/portal.html

myaa_myu
質問者

お礼

ご丁寧に詳しくお教えいただきまして光栄です。ありがとうございます! 参考URLもたくさん教えていただきまして、ありがとうございます! セッションが破棄されるのは24分、けれどそれは1パーセントの確立ということは、ほとんどが破棄されない、と…!これは驚きです。 これから作成するプログラムでは明示的にセッションを破棄するように心がけます。 本当にありがとうございました。

その他の回答 (1)

  • MrYoYoYo
  • ベストアンサー率33% (38/115)
回答No.2

セッションとはセッションIDのことなのか、セッションに保存されているデータのことなのかをもう一度、考えてみてもいいかもしれません。 もし、明示的にセッションに保存したデータがいらないとわかったのならば、そのデータは削除しておくほうがいいです。 セッションIDそのものは別に削除しなくてもいいかもしれませんが、 こちらも削除したほうがいいですね。しかし運用状況においてはsession_destoryだけでは物足りない場合もあります。(レンタルサーバーをお使いなら、おそらく問題ないとは思います。) 現段階としては、不要なデータは残さない。 という方針でやっていけば間違いないと思いますが、 セッションデータの削除をより確実にしたいのならば session_destroy()を行う前に、 $_SESSION = array(); setcookie(session_name(), '', time()-42000, '/'); などをやっておくとより確実です。 説明がへたで申し訳ありません。

myaa_myu
質問者

お礼

ありがとうございます。 セッションとセッションIDのことを指摘されてはっとしました。 一緒に考えていましたので、ご指摘いただけてよかったです。 やはり、明示的に削除したほうがいいのですね。 >$_SESSION = array(); >setcookie(session_name(), '', time()-42000, '/'); これはたしかに確実ですね! 早速利用させていただきます、勉強になりました。ありがとうございました!