[PHP-users 17112]Re: Sessionの保持ができない問題

DANJO Tomoki to_danjo @ electron.ctv.ne.jp
2003年 8月 1日 (金) 11:25:11 JST


おはようございます。
檀上です。

On 2003.08.01 0:55, "Akihiro Kawamoto"  wrote:

> こんばんは、河本です。
> 
>> HTTPプロトコルによる通信は基本的に一回のrequest/responseで
>> セッションを終了します。
>> ユーザが入力したデータもサーバが生成したデータも次のrequest
>> の時には消滅しています。
>> ですから、a.phpでとあるsession_idの(PHPの)セッションを利用
>> していたという情報はb.phpをrequestしたときには消滅しています。
> なるほど、非常によく解かる説明ありがとうございました。
> Session自体が保持されない問題について納得できました。
> 
> しかし・・・こうなると、一つ大きな問題が出てしまいます。
> 本来の目的(?)である、Sessionの保持ができなくなってしまいませんか?
> PHPとはまったく違うものなのかもしれませんが、ASPのセッションでは、
> 最初にセッションを発行すれば、基本的にブラウザを閉じない限りは、
> Actionを行ってページ移動などを行っても、
> Session自体は保持し続けられるような仕様だと思うのですが・・・
> これに代わるものは、みなさまはPHPでどのように作られているのでしょうか?

ごめんなさい、よけいに混乱させてしまったでしょうか。
前のメールでの僕の説明は、なぜb.phpでsession_start()が必要なのか
という疑問に対するものです。

ASPのことはよくわかりませんが、PHPでも最初にセッションを発行すれば
最低でも設定した(session.gc_maxlifetime)保存期間中はセッションに
登録した値は消されることはありません。サーバに保存されています。
ご存じの通り/tmp以下にあります。
ただ、ブラウザが次にb.phpを要求したときに(session.auto_startが無効に
なっている場合)サーバ側ははたしてその要求がさきほど保存したセッションの
利用者かどうか判断しかねるので、明示的にsession_start()としてセッションの
復帰を指示するのです。

サーバはsession_start()によってセッションを開始するときあらかじめ
session_idが指定されていれば同じIDのデータを探して、既に存在していれば
そのセッションを復帰させます。
なければその名前で新しいセッションを生成ます。


例えば、

-- a.php --
<?php
session_start();
session_id("test");
session_register("sess");
$HTTP_SESSION_VARS["sess"] = "str";
echo $HTTP_SESSION_VARS["sess"];
?>

-- b.php --
<?php
$sid = $_GET[SID];
if(!$sid)$sid = "123";
session_id($sid);
session_start();
echo $HTTP_SESSION_VARS["sess"];
?>

上記スクリプトの場合。
(1) まずブラウザからa.phpをrequestします。

    例)http://example.com/a.php
  このとき/tmp以下にtestというIDのセッション情報が保存されます。
  (おそらくsess_testという名前のファイルがあるはずです)


(2) 次にb.phpをrequestします。

    例)http://example.com/b.php
  session_id("123")が実行されるため/tmp下に123(sess_123)という
  空のセッション情報が保存されます。

(3) 最後にセッションIDを指定してb.php

>> そのため、新しくページをrequestするごとにその前のページで
>> セッションを利用していたということと、そのセッションのIDを
>> PHPに教えてセッションの復帰を指示してあげなければいけません。
> セッションのIDを、formやURLに埋め込み、
> セッションIDを渡す(b.phpに教えてやる)ところまでは問題なく動作します。
> しかし、session_id("〜〜〜")で、引き継いだセッションIDに指定し、
> session_start()を行うと、確かに同じセッションIDにはなりますが、
> a.phpでセッションを保存する一時フォルダ(/tmp等)のファイルが
> b.phpでstartされた時に、新規ファイルで上書きされるような形になり、
> 格納したデータが消えてしまいます。
> 
> やはり、個々の値に関しては、その都度セッションID等をキーにして、
> DBなどで管理して保持するしかないのでしょうか?
> 変数が多いため、ページ移動の際に、できればformやURLに埋め込むのではな
> く、
> 1つの何か(変数・配列・構造体など)でページ移動をしたいと考えております。
> 
> 長々と続いてしまっておりますが、よろしくお願い致します。
> 
> -- Akihiro Kawamoto
> 
> 
> _______________________________________________
> PHP-users mailing list
> PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users

-=-=-=-=-=-=-=--=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=
DANJO Tomoki <to_danjo @ electron.ctv.ne.jp>
Chukyo Electron Co.,Ltd. System Div. SDG.





PHP-users メーリングリストの案内