現在の流れは、トップページ⇒ログイン画面⇒(認証処理)⇒その後のページと遷移しているのですが、「session_start」はすべてのページで設定しており、管理はクッキーを利用しています。
ログイン画面では、ユーザーが選択した認証状態にあわせてクッキーをセットしているため、有効期限が例えば一年後のようになっているのですが、その後ほかのページに遷移すると「session_start」の前に有効期限等を設定していないため、有効期限が「ブラウザの終了時」に変更されてしまいます。
セッションに保持されているログイン状態の維持情報を読み出したくてもその時点で「session_start」を呼び出してしまうためその前に有効期限を設定することができません・・・
どうすれば、こういった状態でクッキーの有効期限をログイン時に設定された内容で継続できるのでしょうか?
非常に基本的なことだとおもうのですが、わかりやすくお教えいただけないでしょうか。
よろしくお願いします。
ブラウザに一旦セットされた 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保持用のクッキーとは別に有効期限を判断するものを準備するということですね。
その場合、有効期限を保存するクッキー自体の有効期限はあらかじめ長めに設定しておき(発行されるたびに一年後等?)、セッションIDを管理するクッキーの有効期限には、その有効期限を管理するクッキーに設定されている内容で有効期限を設定するということで理解いたしました。
ご回答を見る限り、一度「session_set_cookie_params」等でクッキーに設定される有効期限を長期に設定しても、別画面に遷移した場合、その都度「session_set_cookie_params」等で有効期限を適切に設定していかないと、クッキーの有効期限は「ブラウザの終了時」に修正(上書き?)されてしまうということでよいのでしょうか?
サーバとブラウザ間の 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
を使ってモニターしてみるとその挙動が良く分かると思います。
ご回答ありがとうございます。
>$_SESSION変数に入れている値の「有効期限が『ブラウザの終了時』に変更されてしまいます」ということでしょうか。
いえ、そうではなく、ブラウザのクッキーに設定されている有効期限が変更されてしまうということです。
私の認識では、意図を持って更新しない限り、単純に「session_start」しただけでは変更されないと思っていたのですが、変更される為、ログイン時点で有効期限を長期に設定しても、ほかの画面に遷移した瞬間に更新されてしまう為こまっております。