アプリ版:「スタンプのみでお礼する」機能のリリースについて

//(1)セッション変数の値をクリア
$_SESSION = array()

//(2)セッションファイルを破棄
session_destroy();

-----------------------------------------------------
以前にも似たようなことを質問させて頂きましたが、
その時には気にならなかった点が気になって来ましたので、
質問させて頂きます。
で、早速ですが、

(2)をするにあたり、(1)をする意味がわからないので、
どなたか教えて下さい。

セッションファイルを削除したならば、
セッション変数は引っ張って来られなくなるのでは?
と私は思っているわけです。

よって、結局、引っ張って来られなくなる変数を、
(1)のようにしてクリアしておく意味が分からないのです。

セッション変数の値は、
セッションファイルから引いてきていると思っているのですが、
そうではないのでしょうか?

----------------------------------------------------------

また、
ちょっと話題は変わり、
unset($_SESSION)としてしまうと、何やらイケナイようなのですが(マニュアルにそう書かれている)、
これをすると、実際、どうなるのでしょう?

セッション変数に登録されている複数の値を消す場合には、
array()を使ったり、session_unset()を使えば
良いことは分かっております。
私が知りたいのは、こういうことではなく、

あくまで、unset($_SESSION)してしまうと、
どうなってしまうのか(復元不能な致命的なソース破壊に陥る?!)、
これが知りたいのです。

よって、大きく分けて、質問は2つあることになります。
以上、よろしくお願い致します。

A 回答 (2件)

unset($_SESSION) については、少なくとも「復元不能な致命的なソース破壊に陥る」と言う事はないと思います。


「正常に動作しなくなる処理がある」と言う程度で、それがどんなものであり、どう影響してくるのかは不明です。

どちらのマニュアルをご覧になられたのかわかりませんが、
http://www.php.net/manual/ja/function.session-un …
によると、「警告 $_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() をコメントにしているので当然このようになります。

はっきりとどのような影響があるのかはわかりませんが、バージョンによって異なるかも知れませんし、少なくとも、ひとつこのような現象があると言う事です。
すっきりしない部分があり、私も気になりますが、データが不正になるような事はありそうです。
また、コードをそのたびにコンパイル実行しているのでコンパイルコードに問題が発生したとしても、ソースそのものがどうにかなるような事はないように思います。
    • good
    • 0
この回答へのお礼

実際に、身を持ってunsetして頂き、どうもすみません。
私は、致命的な破壊につながるのではと思い、怖くて出来ずにおりました。笑

>unset($_SESSION) については、少なくとも「復元不能な致命的なソース破壊に陥る」と言う事はないと思います。
>「正常に動作しなくなる処理がある」と言う程度で、それがどんなものであり、どう影響してくるのかは不明です。

こちらの説明が、
実験して頂いたコードと、その結果を読むことで、
しっかり伝わってきました。
説得力のある回答を頂き、うれしく思います。

unset($_SESSION['example']);
こちらについては問題ない、ということを把握しておりましたが、
unset($_SESSION); については、気になっておりまして、
それが、今回の回答で大分スッキリ致しました。

>はっきりとどのような影響があるのかはわかりませんが、バージョンによって異なるかも知れませんし、少なくとも、ひとつこのような現象があると言う事です。

はい、よくわかりました。^^
こちらの回答も読みやすく、大変助かりました。
どうもありがとうございます。

お礼日時:2009/09/09 15:04

試されるとわかると思いますが 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マニュアルに書かれているように、
完全にセッションを切断するには
セッションクッキーを削除する必要もあるようなので、
こちらも忘れないようにしたいです。

補足日時:2009/09/09 14:52
    • good
    • 0
この回答へのお礼

この度は、どうもありがとうございました。
また機会がございましたら、アドバイスをしていただけるとうれしいです。

お礼日時:2009/09/11 22:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!