- ベストアンサー
$_SESSIONとsession_destroy()の関係性
- $_SESSION = array()の意味とは?セッション変数をクリアする方法です。
- session_destroy()はセッションファイルを破棄するため、セッション変数は引き出せなくなります。
- unset($_SESSION)の使用には注意が必要で、セッション変数の復元が不可能になる可能性があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
unset($_SESSION) については、少なくとも「復元不能な致命的なソース破壊に陥る」と言う事はないと思います。 「正常に動作しなくなる処理がある」と言う程度で、それがどんなものであり、どう影響してくるのかは不明です。 どちらのマニュアルをご覧になられたのかわかりませんが、 http://www.php.net/manual/ja/function.session-unset.php によると、「警告 $_SESSION スーパーグローバルを使用した セッション変数の登録が不可能になってしまうため、 unset($_SESSION) を使って $_SESSION を完全に unset しないでください。」とありました。 私が試してわかった事は unset($_SESSION) の後に session_unset() を実行しても動作しない、でした。 セッションに関する関数が正常に動作しなくなる可能性がある、と言う判断です。 上記の警告にあった「セッション変数の登録が不可能になってしまう」と言う事はなさそうです。 まずこれを実行してみました。 $_SESSION["a"]="a"; unset($_SESSION); echo "unset:"; print_r($_SESSION); $_SESSION["a"]="a"; session_unset(); echo "session_unset:"; print_r($_SESSION); 結果は、 unset:session_unset:Array ( [a] => a ) で unset() には成功していますが、その後の session_unset() には失敗しているようです。 次にこれを実行してみました。 $_SESSION["a"]="a"; unset($_SESSION["a"]); echo "unset:"; print_r($_SESSION); $_SESSION["a"]="a"; session_unset(); echo "session_unset:"; print_r($_SESSION); 結果は、 unset:Array ( ) session_unset:Array ( ) でどちらにも成功しています。 ついでに、こちらも。 $_SESSION["a"]="a"; //unset($_SESSION); echo "unset:"; print_r($_SESSION); $_SESSION["a"]="a"; session_unset(); echo "session_unset:"; print_r($_SESSION); 結果は、 unset:Array ( [a] => a ) session_unset:Array ( ) で unset() をコメントにしているので当然このようになります。 はっきりとどのような影響があるのかはわかりませんが、バージョンによって異なるかも知れませんし、少なくとも、ひとつこのような現象があると言う事です。 すっきりしない部分があり、私も気になりますが、データが不正になるような事はありそうです。 また、コードをそのたびにコンパイル実行しているのでコンパイルコードに問題が発生したとしても、ソースそのものがどうにかなるような事はないように思います。
その他の回答 (1)
- dell_OK
- ベストアンサー率13% (766/5722)
試されるとわかると思いますが session_destroy() を行なってもセッション変数の値は参照できます。 セッションファイルは削除されますが、おそらくサーバーのメモリ上にある値を参照してくるのだと思います。 そのセッションを使用したプログラムが終了するまでは、この変数値は有効であると考えられます。 echo session_save_path(); echo session_id(); これでセッションファイルの場所を確認しておきます。 $_SESSION["a"]="a"; session_destroy(); print_r($_SESSION); これを実行してみると、確かにセッションファイルは削除されていましたが print_r() では参照できていました。 よってこのようにするようになっているのだと思います。 $_SESSION["a"]="a"; $_SESSION=array(); session_destroy(); print_r($_SESSION); が、そのプログラムで継続の処理があるかどうかで $_SESSION=array() をするかどうかを判断されたらいいと思います。 セッションファイルが削除される事で別のプログラムやセッションからはそれがアクセスされる事はないと思いますが、このプログラムに継続の処理があって、そこで参照する必要があるのであれば $_SESSION=array() をしないでいる、とか言う事になると思います。
お礼
この度は、どうもありがとうございました。 また機会がございましたら、アドバイスをしていただけるとうれしいです。
補足
とても分かりやすい回答をどうもありがとうございます。 まず初めに、PHPのバージョンは、PHP 5.2.5 です。 説明不足で、すみませんでした。 >セッションファイルは削除されますが、おそらくサーバーのメモリ上にある値を参照してくるのだと思います。 >そのセッションを使用したプログラムが終了するまでは、この変数値は有効であると考えられます。 ここがポイントですね。 頂いた回答をもとに、私も実験してみました。 ----------------------------------- (a.php) session_start(); $_SESSION["test"] = "test"; echo $_SESSION['test'];//testと出力される //$_SESSION=array(); session_destroy(); echo $_SESSION['test'];//testと出力される ----------------------------------- (b.php) session_start(); echo $_SESSION["test"];//★testと出力されない ----------------------------------- (c.php) ----------------------------------- (d.php) session_start(); echo $_SESSION["test"];//★testと出力されない ----------------------------------- と書き、 a → b → c → d と遷移する場合、 a:セッション値にtestを格納し、セッションファイルを削除 b:一連のセッションの流れで、メモリ上からセッション値を引っ張ってこられるかチェック c:いったん、一連のセッションの流れを断つ d:セッションを復活させて、出力を試みる 結果は、コード中のコメントの通りとなりました。 b.phpにおいても、セッション値は生きているものと予想しておりましたが、実際には死んでおりました。 つまり、 -------------------- $_SESSION=array(); session_destroy(); -------------------- と -------------------- //$_SESSION=array(); session_destroy(); -------------------- の違いは、 a.php つまり、 session_destroy();したスクリプト内でのみ、その違いは現れ、 別のスクリプトへ遷移すると、 両者に違いはなくなる、こんな感じでしょうか。 また、 session_destroy();が完全に行われるのは、 それを実行したスクリプトファイルが終了したとき、 なのでしょうね。 なお、 phpマニュアルに書かれているように、 完全にセッションを切断するには セッションクッキーを削除する必要もあるようなので、 こちらも忘れないようにしたいです。
お礼
実際に、身を持ってunsetして頂き、どうもすみません。 私は、致命的な破壊につながるのではと思い、怖くて出来ずにおりました。笑 >unset($_SESSION) については、少なくとも「復元不能な致命的なソース破壊に陥る」と言う事はないと思います。 >「正常に動作しなくなる処理がある」と言う程度で、それがどんなものであり、どう影響してくるのかは不明です。 こちらの説明が、 実験して頂いたコードと、その結果を読むことで、 しっかり伝わってきました。 説得力のある回答を頂き、うれしく思います。 unset($_SESSION['example']); こちらについては問題ない、ということを把握しておりましたが、 unset($_SESSION); については、気になっておりまして、 それが、今回の回答で大分スッキリ致しました。 >はっきりとどのような影響があるのかはわかりませんが、バージョンによって異なるかも知れませんし、少なくとも、ひとつこのような現象があると言う事です。 はい、よくわかりました。^^ こちらの回答も読みやすく、大変助かりました。 どうもありがとうございます。