PHPでセッションを利用する場合の有効期限の設定方法で困っています。


現在の流れは、トップページ⇒ログイン画面⇒(認証処理)⇒その後のページと遷移しているのですが、「session_start」はすべてのページで設定しており、管理はクッキーを利用しています。

ログイン画面では、ユーザーが選択した認証状態にあわせてクッキーをセットしているため、有効期限が例えば一年後のようになっているのですが、その後ほかのページに遷移すると「session_start」の前に有効期限等を設定していないため、有効期限が「ブラウザの終了時」に変更されてしまいます。

セッションに保持されているログイン状態の維持情報を読み出したくてもその時点で「session_start」を呼び出してしまうためその前に有効期限を設定することができません・・・

どうすれば、こういった状態でクッキーの有効期限をログイン時に設定された内容で継続できるのでしょうか?

非常に基本的なことだとおもうのですが、わかりやすくお教えいただけないでしょうか。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/10/02 03:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント27pt

$_SESSION変数に入れている値の「有効期限が『ブラウザの終了時』に変更されてしまいます」ということでしょうか。

$_SESSION変数の寿命はセッション期間中ですので、これはこれで正しい処理です。

Cookieとして寿命を延ばしたいのであれば、$_SESSION変数とは別の名前で、setcookieで有効期限を含めて設定すればいいでしょう。

id:jyack

ご回答ありがとうございます。

>$_SESSION変数に入れている値の「有効期限が『ブラウザの終了時』に変更されてしまいます」ということでしょうか。

いえ、そうではなく、ブラウザのクッキーに設定されている有効期限が変更されてしまうということです。

私の認識では、意図を持って更新しない限り、単純に「session_start」しただけでは変更されないと思っていたのですが、変更される為、ログイン時点で有効期限を長期に設定しても、ほかの画面に遷移した瞬間に更新されてしまう為こまっております。

2008/09/25 09:01:41
id:thrillseeker No.2

回答回数328ベストアンサー獲得回数37

ポイント27pt

ブラウザに一旦セットされた cookie の有効期限を後からサーバ側で

再度取得することは HTTP の仕様上出来ないようです。

そこでログイン画面で Cookie を設定する際に、これとは別に有効期限を

値とした cookie を設定しておき、これを後から利用する方法があります。


ログイン画面:

<? 
    $expireTimestamp = time() + 365*24*60*60;
    setcookie("Login","dummy",$expireTimestamp);
    setcookie("ExpireTime",$expireTimestamp,$expireTimestamp);
?>

その他のページ:

<?
    // 現在の時間からLogin cookieの有効期限までの秒数を計算
    $sessionLifetime = $_COOKIE['ExpireTime'] - time();
    // セッションの有効期限を設定する
    session_set_cookie_params($sessionLifetime);
    // セッションを開始する
    session_start();
?>

Login cookie を破棄する時には ExpireTime も一緒に破棄する

のを忘れないようにして下さい。

id:jyack

具体的なサンプルをあげていただきありがとうございます。

サンプルでご提示いただいた内容は、大変わかりやすく理解できました。

セッションを管理するセッションID保持用のクッキーとは別に有効期限を判断するものを準備するということですね。

その場合、有効期限を保存するクッキー自体の有効期限はあらかじめ長めに設定しておき(発行されるたびに一年後等?)、セッションIDを管理するクッキーの有効期限には、その有効期限を管理するクッキーに設定されている内容で有効期限を設定するということで理解いたしました。

ご回答を見る限り、一度「session_set_cookie_params」等でクッキーに設定される有効期限を長期に設定しても、別画面に遷移した場合、その都度「session_set_cookie_params」等で有効期限を適切に設定していかないと、クッキーの有効期限は「ブラウザの終了時」に修正(上書き?)されてしまうということでよいのでしょうか?

2008/09/25 09:06:48
id:thrillseeker No.3

回答回数328ベストアンサー獲得回数37

ポイント26pt

サーバとブラウザ間の Cookie のやりとりを調べるには、Firefox に

Live HTTP Headers というアドオンを追加すると便利ですよ。

メニューバーの「ツール」から Live HTTP headers 画面を開き、

テストページにアクセスしながら、

・ブラウザからのリクエストヘッダーの中ににある Cookie: で始まる行

・サーバからの応答ヘッダーの中にある Set-Cookie: で始まる行

をモニターします。


試してみると分かりますが、最初の session_start() によって PHPSESSID

という名前のクッキーに32桁のランダム文字がIDとして設定されます。

そしてそれ以降はそのセッションが終了するまでは session_start() が

呼ばれても PHPSESSID のID値及び有効期限は変更されないようです。

session.gc_maxlifetime を使った場合についても、Live HTTP Headers

を使ってモニターしてみるとその挙動が良く分かると思います。

  • id:pahoo
    #1で回答したものです。回答のピントがズレていたようで、ごめんなさい。
    thrillseeker さんが具体的なサンプルを掲げているので参考にしていただきたいのですが、ブラウザ側の設定も確認してみてください。
    たとえば FireFox ですと「Firefoxを終了するまで」というオプション設定ができますが、これを設定していると、サーバ側で設定した期間に関係なく FireFox 終了時に Cookie の寿命が尽きます。
  • id:jyack
    ご回答ありがとうございます。

    ブラウザ側の設定は確かにブラウザ毎にもことなりますので注意します。

    ちょっと疑問におもったのですが、ある呼び出しの際は

    ini_set('session.gc_maxlifetime','2880');
    session_start();

    とし、別な呼び出しでは・・・

    ini_set('session.gc_maxlifetime','1440');
    session_start();

    とした場合ですが、このセッションの有効期限は
    前者は2880秒、後者は1440秒となるのでしょうか?
    クッキーはそれぞれのブラウザ単位で設定できることは理解できたのですが、
    GCの場合、上記の設定に従って、GCの発生タイミングでここの「session.gc_maxlifetime」にしたがって
    SESSION変数が処理されると考えてよいのでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません