人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

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


●質問者: jyack
●カテゴリ:インターネット ウェブ制作
✍キーワード:PHP クッキー セッション トップページ ブラウザ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●27ポイント

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

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

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

◎質問者からの返答

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

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

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

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


2 ● thrillseeker
●27ポイント

ブラウザに一旦セットされた 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」等で有効期限を適切に設定していかないと、クッキーの有効期限は「ブラウザの終了時」に修正(上書き?)されてしまうということでよいのでしょうか?


3 ● thrillseeker
●26ポイント

サーバとブラウザ間の 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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ