• ベストアンサー

セッションを保持する時間を確定する関数ってあるのでしょうか?

タイトル通りなのですが、PHPでセッションを保持する時間を確定する関数ってあるのでしょうか? 検索すると、php.iniのsession.gc_maxlifetimeを指定すれば可能のようですが、PHPファイルにセッションの保持時間を違う物に指定したい場面がありますので、使用できません。 ここでは1時間、ここでは2時間、というようにPHP文中で指定する関数というのはありますでしょうか? よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ちょっと探しましたが、ありそうだけど、無いのですかね? 実質的には無くてもあまり問題ないから、無いのかもしれません。 Cookieと違い、セッションというのは、一連の動作のなかで保持されるものです。基本的には途中で止めるまでは保持されるべきものだと思いますが、何時間も、という事だと確かに。 php.iniのsession.gc_maxlifetimeで指定出来るようですが、デフォルトは18000秒=300分=5時間という事ですね。ちょっと長い気はするけど、まぁ一般的には妥当な数字かと。 環境によって違いますが、場面場面で変える場合は .htaccessで変更可能かと。 例えば1時間に設定する場合 <IfModule mod_php4.c> session.gc_maxlifetime = 3600 </IfModule> プログラム的に実装する事も比較的簡単だと思います。 短くする場合は特に簡単です。セッションに開始時刻を入れておき、それ以上経過した場合はセッションを破棄すればいいです。 例えば、 $now = time(); if(($now - $_SESSION[s_time]) < 3600){ $time = round(($now - $_SESSION[s_time])/60); echo "あと{$time}分内に処理を終えて下さい"; }else{ unset($_SESSION); $_SESSION[s_time] = $now; echo "有効期限切れなので最初からやり直して下さい"; } のように。 #上記コードは検証していないので、ちゃんと動くか分かりませんが、だいたいそんな感じです。 逆に、5時間とかケチケチしないで何時間でも保持したい場合は、セッションIDをuniqid()あたりで作ってcookieに格納しておき、セッションIDに紐づくデータをサーバ側のDBなりテキストに保持しておけば良いです。

ikazuti
質問者

お礼

なるほど、無いのですか。 私も検索してみて無かったので、やっぱり無いのでしょうかね。 ただ、やりたいことは.htaccessで可能のようですのでご回答していただきました方法を試してみます。 ご回答頂き、ありがとうございます。

関連するQ&A

  • セッション時間について

    プログラム初心者です コアサーバーとゆうレンタルサーバーを使っています。 phpの設置しているディレクトリに自前のphp.iniを置けば反映されるらしいです セッション切れの時間をのばす方法を教えてください(自前でphp.iniを作る方法を教えてください) サーバーのphpinfo確認したら session.cookie_lifetime 0 0 session.gc_maxlifetime 1440 1440 になっていました 自前のphp.iniにsession.gc_maxlifetime = 3600と一行だけ記述するだけでできますか? それとも、php.iniにxamppにあるような設定をワラワラ書かないといけませんか? php.iniのパーミッションは何にしたほうがいいでしょうか?見えるとまずいですよね? よろしくお願いします  

    • ベストアンサー
    • PHP
  • 初歩的な質問 セッション管理について

    セッション処理をしたいと考えていますが、 分からない点が多く困っています。 したいと思っていることは、「ログイン」的な処理です。 訪問者がブラウザを閉じても、サイト設計者が設定した「期間」、 ログイン状態をキープさせておけるような仕様です。 ※よくあるタイプです。 (特段、難しいことや変わったことをしようとしてはいません。) ただ、ちょっと変わっている点は、ログインはパスワード無しで行います。 フォーム(POST)でボタンをクリックしたら、誰でもログインできるようなものです。 で、上記処理をする方法として、大きく分けて、 (1)クッキー($_COOKIE)を使う方法と、 (2)セッション($_SESSION)を使う方法とがあるように思っています。 (1)の方法だと、 データそのものをクライアント側に保存させるのでセキュリティ上、やや難があり、 (2)の方法だと、「キー(セッションID)」だけをやりとりするので比較的安全、 ということをよく耳にします。 ただ、パスワードを扱うわけではないので、この場合には、 (1)の方法でもアリな気がしています。 しかし、今後、パスワード形式に移行しないとも限らないので、 (2)を使った方法で話を進めたいと思います。 パスワードのやりとりがないのなら、(1)の方が断然楽でいいよ~ ということであれば、話は変わってきます。 その場合には教えて下さい。 (※質問文の中で、私は随所に変なことを言っている可能性がありますので、 適宜、ご指摘頂けると嬉しく思います。) 話を戻しまして、 ここからは、前述の(2)の方法で話を続けさせて頂きます。 セッション処理の流れについてですが、 セッションIDをクライアントに送りつけ、保存させる方法は、 session_start()をスクリプト先頭に書き、 $_SESSION['login'] = 'おまえはもう、ログインしてる…。'; と、どこかに書くことで、 この$_SESSION['login']値を保持している間、訪問者は、 サイト内のページを、ログインされた状態として閲覧できる と、私は考えています。 何か変なことを言っていましたら、ご指摘下さい。(★ポイント1) //----------------------------------- 次に、セッション保持期間の設定の方法についてですが、 ネット上で調べた所、 ini_set("session.gc_maxlifetime", "1440"); のように設定できると書いてありました。 このini_set()による設定が、どう作用するのか、 この点もよく分からずにいます。(★ポイント2) session.gc_maxlifetimeの設定自体は、スクリプト終了とともに、 Master Valueに戻されるようですが(PHPマニュアルより)、 私が気になっているのは、 そのスクリプトで生成したセッションの保持期間は、どうなっているのか? ということです。 ちょっと乱暴な書き方をしますが、 例えば、 php.ini上(つまり、Master Valueの設定値)では、 session.gc_maxlifetime:1440 というような設定 の場合に、 スクリプトAの中で、 ini_set("session.gc_maxlifetime", "~仮に24時間としておきます~"); のように書き、 そのあとに、 $_SESSION['login'] = 'おまえはもう、ログインしてる…。'; と書いた場合、 クライアントには、$_SESSION['login']のデータは24時間保持される、 ということでしょうか。 つまり、 スクリプト内に書いた、 ini_set("session.gc_maxlifetime", "~仮に24時間としておきます~"); という記述は、 そのスクリプトでセッションIDをクライアントに与える場合の「そのセッションIDの保持期間」のみ を設定できる、という理解でよろしいでしょうか。 当たり前のことをお聞きしているかもしれませんが、 どなたか、どうか、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでセッションが切れない

    いつもお世話になります。 現在、練習用として管理画面を作成しています。 session.gc_maxlifetime=1440(24分)で設定しているのですが、一時間以上放置してもセッションが切れません。。 session.gc_maxlifetime以外に何か設定が必要なのでしょうか? PHPのバージョンは5.3.3になります。

    • 締切済み
    • PHP
  • セッションファイルの有効期限ですが、

    セッションファイルの有効期限ですが、 phpのデフォルトでは session.gc_maxlifetimeが1440、 session.gc_probabilityが1のようなんですが、 これだとローカル環境で確認したところ、 2日くらい前のセッションファイルでもサーバ側に残っています。 いくらsession_regenerate_id(true)とかやっても、いきなり画面を閉じたりすると このように残ってしまうのですが、デフォルトの設定のままだと危険ではないでしょうか? また、ためしに設定を session.gc_maxlifetimeを5、 session.gc_probabilityを100に変えてみたところ、 古いセッションファイルはすぐに削除されましたが、 最新のものだけはなぜか残り続けました。 セッションファイルの削除はどのように実装されていますか?(特に画面をいきなり閉じられた場合の対策) また、session.gc_maxlifetime、session.gc_probabilityのデフォルト値は変更していますでしょうか? さらに、サーバ側のセッションファイルさえ破棄してしまえば、クライアントのセッションクッキーは残っていても別に問題ないと思うのですが、どうでしょう? ちなみに私のPHPバージョンはwindows版の5.2.4です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 自動ログアウト

    ログインページを作っていまして、時間が経つと自動的にログアウトするようなページを考えています。 セッションのタイムアウト時間の変更はini_set関数でsession.gc_maxlifetimeの値を変更すればいいことがわかりましたが、上手く動作しません。 他に何か設定しなければいけないのでしょうか。 よろしくお願いします。 //テストのため、10秒後にタイムアウト ini_set("session.gc_maxlifetime","10");          ・          ・          ・ session_start();

    • 締切済み
    • PHP
  • header(Location:~)で$_SESSION[" "]が保持されない。

    自宅サーバー(apache2+php5+mysql5)のlocalhost環境で、 header(Lcation:~)の記述をすると、 セッションが保持されない現象が起きています。 本番環境のレンタルサーバーは、同じ記述で、 しっかりとセッションが保持されます。 この原因は、何でしょうか? php.iniの設定など、何か考えられることがあれば、 是非教えて下さい。 【やりたいこと】 ■a.php **************************************** <?php echo<<<EOD <form method="POST" action="./b.php"> <INPUT type="text" name="test"> <INPUT type="submit" name="Submit" value="確認画面へ"> </form> EOD; ?> ■b.php **************************************** <?php $_SESSION["test"]=$_POST["test"]; header("Location:./c.php"); ?> ■c.php **************************************** <?php echo $_SESSION["test"]; ?> 自宅サーバーだと、 a.phpで入れたデータが、c.phpで表示されません。 レンタルサーバーだと、 セッションが保持され、表示されます。

    • ベストアンサー
    • PHP
  • セッション内容が化ける?

    PHP初心者です。 次の環境で一種のグループウェアを開発しました。 OS: RedHat Linux9.0 Web Server: Apache2.0.10 DB: PostgresSQL 7.4.2 PHP4.2.2 「ある社員が、ログインしたまま会議に出席し数時間後に戻ってみると、 画面内容が別の社員のものになっている」 という不可解な報告がありました。 調べてみるとログイン時のポータル画面は変化していないのですが、そこから 画面を切り替えて明細表示すると、社員名称が別の社員になっているのです。 しかも明細内容は何も表示されていません。 セッションで取得した内容が化けているのではないかと思っているのですが、 知識不足で行き詰まっています。 php.ini の設定は次のようになっています。(defaultだと思われます) session.save_handler = files session.use_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 100 session.gc_maxlifetime = 1440 session.bug_compat_42 = 1 session.bug_compat_warn = 1 session.referer_check = session.entropy_length = 0 session.entropy_file = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 原因と対処法が分かる方、どうか教えてください。

    • 締切済み
    • PHP
  • セッション機能が使えない

    セッション機能を使って開発していたのですが、どうも思うように動作しないので、書籍に載っていた簡単なプログラムを試してみましたが動作しませんでした。 <書籍のソース> <?php session_name("MYSESS"); session_start(); if(!session_is_registered("access")) { session_register("access"); $access=1; } else { $access++; } ?> <html> <body> <p><?=$access?>回目の訪問です</p> <p><a href="sample.php?<?=SID?>">ここをクリック</a></p> </body> </html> 実行すると、「1回目の訪問です」と出て、クリックしても1回目のままで、増えることがありません。 <php.iniのsessionに関する部分の設定> [Session] session.name=PHPSESSID session.auto_start=1 session.serialize_handler=php session.gc_probability=1 session.gc_divisor=100 session.gc_maxlifetime=1440 session.bug_compat_42=0 session.bug_compat_warn=0 session.cache_limiter=nocache session.cache_expire=180 session.use_trans_sid=0 セッションデータは、ファイルとしては保存されていますが、中を見ると access|N; となっています。 他にもスクリプトを試しましたがすべてこのファイルのデータはNのままで値が保存されることがありません。 お気づきの点がありましたらご指摘をお願いいたします。

    • ベストアンサー
    • PHP
  • phpのセションのタイムアウトについて

    os:ターボ8 PHP:4.2.3 phpのセションのタイムアウトについてご教授願えないでしょうか Q1.タイムアウトの初期値は変更できますか? php.iniの session.gc_maxlifetime = 1440 を session.gc_maxlifetime = 60 にしてhttpdを再起動して試してみたのですが1分以上放置してもセッション情報は残ったままでした。 これってどうなのでしょうか? Q2.プログラム内でタイムアウトの設定を確認するシステム変数はありますか? ちゃんとタイムアウトの時間が変わっているか確認したいのですが。 Q3.タイムアウトの時間を無限大にしてタイムアウトしない設定にする方法はありますか? 以上、個別でも結構ですのでお願いします。

    • 締切済み
    • PHP
  • セッションの有効期限

    Linux7.2 + PHP4.2(DSO版)+ Apacheを使用しセッション管理を使用した認証機能を制作しています。 session.cache_expire = 180としているのに ログイン後20分くらいでセッションが切れる現象が生じています。 プログラム上では特別なことはしていません。 session_start(); session_cache_limiter('nocache'); を先頭に書いているだけです。 以下、php.iniのセッション関連の設定です。 どなた方この現象についてご存知でしたら教えて下さい。 宜しくお願いします。 session_auto session.save_handler = files session.save_path = /tmp session.use_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.gc_probability = 1 session.gc_maxlifetime = 1440 session.referer_check = session.entropy_length = 0 session.entropy_file = ;session.entropy_length = 16 ;session.entropy_file = /dev/urandom session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0

    • 締切済み
    • PHP

専門家に質問してみよう