//(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で質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qパソコンに現れる警告の意味と解消策

パソコンを終了しようと思って全てのアプリを終了させると「sfbrunが原因でKERNEL32,DLLにエラーが発生いたしました。」との警告が出ます。この警告を閉じないと終了できません。この警告の意味とこの警告が出ないように解決する方法を教えてください。

Aベストアンサー

「sfbrun」で調べていったら「驚速パソコン」という名前に当たりましたけれど、使ってますか?
そのツールをアンインストールしてください。それでそのメッセージは出なくなると思います。

今使っていて、有効性はありますか?
別の方法で、パソコンの動作を軽くするべきかと思います。

Meですから、データのゴミ取りと、スキャンディスク・デフラグの実施で変わってくると思います。
次のツールを使って、ゴミ取り等を実行してみてください。

そうじ小僧(Vector)
http://www.vector.co.jp/soft/win95/util/se267032.html

QPHP session_destroyとsession_unsetの違い

session_destroyとsession_unsetの違いは何でしょうか
session_unsetはセッションの開放します
session_destroyはセッションを破壊しますといわれても
よくわかりません。

Aベストアンサー

unsetはセッションに登録されている要素の開放
destroyはセッション自体の開放ですね。

destroyを読んだ後はセッションが使用できない
(出来ても動作が保証されない)
と言った感じで把握してください。

Q回転灯(警告灯)の色の意味

パトカーなどの緊急車両に点いている赤色回転灯(警告灯)、工事車両などに点いている黄色回転灯(警告灯)などありますが、ほかに、青色、緑色、紫色がある(wikipediaより)ということなんですが、今一度、その色の意味を教えてください。

Aベストアンサー

http://www.patlite.co.jp/saiyojoho/patlite/01.html

簡単にですがURLにでていますから見てください。

Q「$errors = array();//エラーを格納する$errors変数を初期化する」

参考URL:http://afurieitohannei.la.coocan.jp/aaaphp.htm
以上のURL先にあります、 
$errors = array();//エラーを格納する$errors変数を初期化する
のですが!$errors = aaa();に変えてもプログラムに影響はありますか?
まだ動作確認が取れていないので試すことができません。

 よろしくお願いします。

Aベストアンサー

>$errors = aaa();に変えてもプログラムに影響はありますか?

影響がないとは言えない。
ただしaaa()が「return array();」的な空配列を返しているなら問題ない。
いずれにしろ書き方の問題というより、初期化とは何かを理解すれば自明です。

Qこんな表示が、出てきました。 意味が、分かりません。ただ警告とという文字が、とても、気になります。

こんな表示が、出てきました。
意味が、分かりません。ただ警告とという文字が、とても、気になります。
詳しく教えて頂けるとありがたいです。
宜しくお願い致します。

Aベストアンサー

そのソフトをインストールするとウィルス感染の可能性があるよ、と警告しています。
可能性の警告なので、本当にウィルスが仕込まれているかどうかは解りません。
信頼ある有料のアプリなら先ず問題有りません。

怪しいアプリならいれるのは控えるか、アプリ名で色々調べてから大丈夫なら入れるかした方が良いです。

iPhone自体はウィルス対策万全なので、osさえ最新にして置けば感染する事は先ず有りませんケド。

Qsession_set_save_handler と session_regenerate_id は同時に使えない?

session_set_save_handlerを利用してセッションデータをDBに格納しているのですが、session_regenerate_idを使用するとIDが毎回変わるため、session_set_save_handler での UPDATEやDELETEなどが出来なくなってしまいます。

DELETE FROM session WHERE sid = ".session_id()."の為。

どのようにすれば両方同時に使用できるのでしょうか?

Aベストアンサー

session_set_save_handler関数は、
設定可能な各、open/close/read/write/destroy/gcに
引数として付加する値がありまして、
writeだった場合は、第一引数にセッションのIDが与えられます。
この値を元に値を格納すればよいのではないかと思いますが、いかがでしょうか。

質問者さんの例文はdestroyなので、destroyの例を下記に。
<?php

function _destroy($session_id){
global $DBCON;

mysql_query($DBCON, "DELETE FROM session WHERE sid = '".$session_id."'");
return true;
}

?>
上記はmysqlを使用している場合の一例です。
session_id関数を参照するのではなく、引数として与えられてきたセッションのIDを参照しています。
また、PHP5.1.0以降をお使いであれば、session_regenerate_id(true)と引数にtrueを入れてやれば、古いセッションはregenerateされたときに削除されることを補足しておきます。

直、そのほかの関数に関して、全体的にどのように書くかは
http://yuubiseiharukana.blog.shinobi.jp/Date/20090316/1/
上記URLのブログのエントリでまとまっておりましたので参考にされると良いかも知れません。

session_set_save_handler関数は、
設定可能な各、open/close/read/write/destroy/gcに
引数として付加する値がありまして、
writeだった場合は、第一引数にセッションのIDが与えられます。
この値を元に値を格納すればよいのではないかと思いますが、いかがでしょうか。

質問者さんの例文はdestroyなので、destroyの例を下記に。
<?php

function _destroy($session_id){
global $DBCON;

mysql_query($DBCON, "DELETE FROM session WHERE sid = '".$session_id."'");
return true;
}

?>
上記...続きを読む

Qトヨタアリストの警告灯の意味を教えてください。

トヨタアリストの警告灯の意味を教えてください。
車の絵で正面から見ると下のほう、つまり後部だと思うのですが、左右のランプが
点燈しているような絵です。半ドアではないです。よろしくお願いします。

Aベストアンサー

それはたぶん後部のテールランプの球が切れてると思います。
確認してみてください。

Qforeach($stock as $name => $value){ の$value)で値用の変数

<!DOCTYPE html>
<html>
<head>
<title>P161 Sample6-7 array()を使う</title>
</head>
<body>

<?php

$stock = array("みかん"=>80,"いちご"=>60,"りんご"=>22, "もも"=>50,"くり"=>57);

?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>番号</th>
<th>個数</th>
</tr>

<?php

foreach($stock as $name => $value){
print "<tr><td>{$name}</td><td>{$value}個</td></tr>\n";
}

?>

</table>

</body>
</html>
以上の foreach($stock as $name => $value){ 
 のforeach文は特殊な繰り返し文で$stockは”変数名”・$name"はキー(引出し)用の変数・
 ここまでは何となく意味がわかります。最後のは$valueは”値用の変数”・・とあります。
 ここで言う、”値用の変数”の値とは何のことなのでしょうか? 
 よろしくお願いいたします。

<!DOCTYPE html>
<html>
<head>
<title>P161 Sample6-7 array()を使う</title>
</head>
<body>

<?php

$stock = array("みかん"=>80,"いちご"=>60,"りんご"=>22, "もも"=>50,"くり"=>57);

?>

<table border="2">
<tr bgcolor="#AAAAAA">
<th>番号</th>
<th>個数</th>
</tr>

<?php

foreach($stock as $name => $value){
print "<tr><td>{$name}</td><td>{$value}個</td></tr>\n";
}

?>

</table>

</body>
</html>
以上の foreach($stock as $name => $value){ 
 のfor...続きを読む

Aベストアンサー

$name には、"みかん"、"いちご" など。$valueには、80や60が入ります。

> $stock = array("みかん"=>80,"いちご"=>60,"りんご"=>22, "もも"=>50,"くり"=>57);

の => という記号と対応しているでしょ?

Q警告ログの意味

XPパソコンです。SP1
起動後、アウトルックエキスプレスをクリックしたら、エラー(メッセンジャー:問題が発生・・・・・)と共に、ペストパトロールの警告が出ました。
この意味がわからないので 教えてください。
cws.yexe Prcessld"3748"File"?"

 一応隔離を選択し、スキャンしました。
検出は0でした。

Aベストアンサー

私は「ペストパトロール」も「アウトルックエキスプレス」も使っていませんので、一般的な説明しかできませんのであしからず・・・。

>隔離を選んだのですが、たびたび警告があります。
>アウトルックエキスプレス起動後です。

警告の内容がわからないのでなんとも言えません。

>「ポン」というウインドウズの警告音

音だけでメッセージがないとなると判断のしようがありません。

>隔離ではなく駆除のほうがいいのでしょうか。

「隔離」というのはウィルス対策ソフトが誤って検出した可能性のあるファイルをバックアップしたり、調査研究のため保存しておく機能です。

特別な目的がない限り、不要、かつ、有害なファイルを大事にしまっておく必要はありませんのでファイルのプロパティを調べて削除するのがいいと思います。。

☆ファイルのプロパティ

実行ファイル(拡張子が「Exe」「Dll」等のファイル)の場合、
1.エキスプローラでファイルを右クリックしてメニューのプロパティを選択。
2.「バージョン情報」タブをクリック
3.「会社名」「製品名」が空白の場合ウィルス、スパイウエアと考えていいでしょう。

>この意味がわからないので 教えてください。
>cws.yexe Prcessld"3748"File"?"

1.「Ctrl」+「Alt」+「Del」を押してタスクマネージャを開きます。
2.「プロセス」タブをクリック
3.「イメージ名」が「cws.yexe」「PID」が「3748」が起動されている。

という意味でしょう。

「File"?"」については何の意味かわかりかねます。

タスクマネージャに今でも「cws.yexe」が表示されるなら、ウィルスが駆除されていないことになります。

下記ソフトでスキャンしてみてください。

☆「CWShredder」

CWShredder
http://www.trendmicro.com/cwshredder/

CWShredderによるCoolWebSearchの除去
http://www.higaitaisaku.com/removecws.html

☆「Ewido」

ただし、他のウィルス対策ソフトとの干渉を避けるためインストール時の
「Additional Options」画面で下記の項目のチェックをはずしてインストールしてください。

Install background guard (required for automatic updates)
Install scan via context menu

ewido security suite
http://www.ewido.net/en/download/

ewido networks スキャン
http://eazyfox.homelinux.org/SecuTool/ewido/ewido01.html

私は「ペストパトロール」も「アウトルックエキスプレス」も使っていませんので、一般的な説明しかできませんのであしからず・・・。

>隔離を選んだのですが、たびたび警告があります。
>アウトルックエキスプレス起動後です。

警告の内容がわからないのでなんとも言えません。

>「ポン」というウインドウズの警告音

音だけでメッセージがないとなると判断のしようがありません。

>隔離ではなく駆除のほうがいいのでしょうか。

「隔離」というのはウィルス対策ソフトが誤って検出した可能性の...続きを読む

QPHP5のセッション管理に使う$_SESSIONに関する質問

現在本と、WEBの入門サイトの二つでPHPを学習しているのですが

$_SESSION変数を利用したアクセスカウンタのサンプルで
WEBの情報では$_SESSIONを

$_SESSION['count']

と書いていました(WEBはPHP4)
そして、本の方では

$_SESSION['acces_count']

と書いてありました
そして、私は
$_SESSION['acces_count']

$_SESSION['testtest']

に変えて実行してみた所これでもエラーが出ずに実効できました

$_SESSION変数のキーは、いかなる物でもかまわないのでしょうか

Aベストアンサー

ええ、任意の名前でOKです。

変数の名前を自由に付けられるのと同じです。


人気Q&Aランキング

おすすめ情報