質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1488閲覧

phpによる基礎的なセッションタイムアウトの方法について

hatsuzo

総合スコア56

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/06/18 01:18

お世話になっております。
phpのスクリプトで簡単なサイトを作ったのですが、今更ながらセッションの管理を行っていないことが問題になりそうなので、組み込む必要があります。
[環境]php5.5/WindowsServer2008/IIS
親プログラムでセッションの有効期限を設定し、別の画面に遷移した時に、セッション変数が生きているのかを確認すればよいのかなという認識で、実装する前に簡単な例で試してみました。

親プログラムを表示したまま15秒以上放置した状態で、子プログラムを呼び出した時に、セッション切れという判定を出したいのですが、うまくできません。

考え方が根本的に間違っているのか浅はかなのか、ご指摘頂けないでしょうか?

php

1[親プログラム:sess01.php] 2<?php 3// セッションの有効期限を15秒に設定 4ini_set( 'session.gc_maxlifetime', 15 ); // 秒(デフォルト:1440) 5ini_set( 'session.gc_probability', 1 ); // 分子(デフォルト:1) 6ini_set( 'session.gc_divisor', 1 ); // 分母(デフォルト:100) 7session_start(); 8if (!isset($_SESSION['name'])) { 9 // キー'count'が登録されていなければ、1を設定 10 $_SESSION['name'] = "test"; 11} 12echo $_SESSION['name']."に設定しました。<br />"; 13echo "<a href='sess02.php'>次の画面へ</a>"; 14?> 15 16[子プログラム:sess02.php] 17<?php 18// セッション管理開始 19session_start(); 20if (!isset($_SESSION['name'])) { 21 echo "セッションが切れています。<br />"; 22} else { 23 echo "セッション名は{$_SESSION['name']}です。<br />"; 24} 25echo "<a href='sess01.php'>元の画面へ</a>"; 26?>

セッションの保存先を指定する必要があるという記事を見かけたので、
session_save_path('\session');
としても、エラーになってしまいます。
そこで、WindowsServer上のフルパスで
session_save_path('f:\myweb\session');
と書くとエラーは出なくなり、実際に指定したフォルダにセッション情報のファイルが作られることは確認できたのですが、
今度は、時間経過前にセッションが切れた状態になってしまいます。

なにとぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/18 01:46

セッションもそうですがPHP5.5という古い環境もかなり問題と思うのですが、どういった背景で5.5なのでしょうか エラーが出るのでしたらそのエラーメッセージをそのまま提示してください 「うまくいかない」ではなく想定される動作と実際の現象を具体的に記載してください >時間経過前にセッションが切れた状態になってしまいます。 それは正しい挙動ではないでしょうか?
hatsuzo

2019/06/18 02:07

コメントありがとうございます。 特に理由もないのですが、作ってそのままの状態になっている、といったほうが正しいです。確かに7.xまで進んでいますから問題ですね。 エラーが出る訳ではありません。 そもそもセッションという概念がよく判っていないのだと思いますので、恥かしながら、お尋ねします。 セッションの寿命を決めるということは、 指定した時間まではそのセッションIDで作ったセッション変数の値が生きている、したがって、セッション変数の値を取得できるかどうかでセッションが生きているかどうかを判定すればよいと思っていたのですが、意味が違うのでしょうか?
m.ts10806

2019/06/18 02:09

>としても、エラーになってしまいます。 とあるのでどんなエラーなのかなと思いまして。
hatsuzo

2019/06/18 02:34

どうもすいません。 言葉足らずでした。 Warning: session_start(): open(\session\sess_gqvin9gkvgbpq9akhnl1kap213, O_RDWR) failed: No such file or directory (2) in F:\myweb\sess01.php on line 9 というパスが通らないエラーです。したがって、ここに出ているWindowsサーバーのフルパスで書いたらエラーは出なくなりました。
m.ts10806

2019/06/18 02:48

そうですね。基本はフルパス指定だと思います。
guest

回答2

0

ベストアンサー

ini_set( 'session.で生存時間を制御するのはなかなか難しいです。

session の値の一つとして、「session の登録(発生)時間」を記録し、それと現在を比べて、生存期間内かの判定をさせるってのをよく見かけます。

投稿2019/06/18 09:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/06/18 23:37

コメントありがとうございます。 セッション変数もしくはCookieを使って経過時間を判定すればできるとは思いますが、セッションの有効期限というのは、タイムアウトの判定には使いづらい、ということなんですね? ネットで探しても合致する例を探し当てることができませんでした。
退会済みユーザー

退会済みユーザー

2019/06/18 23:40

cookie がクライアントの時計に依存し、gc が確率に依存するので、厳密な制御には向いていません。 そのため、サーバの時間を基準とした判定ができるように工夫しているケースがあり、よく見られるのが回答に記述した方法です。
hatsuzo

2019/06/19 09:42

有難うございました。 Windowsのシステム時刻をネット上のタイムサーバーから取るのと同じような意味ですね。 同じセッション内でフォームを開いた時の時間と、次の画面に遷移してフォームを開いた時の時間差を取得して、一定時間を超える場合にタイムアウトの画面に飛ばすようなFunctionを作って各フォームに埋め込むことにしました。 タイムアウトの画面を閉じる時に、セッションを切断する処理を実行しようと思います。 どこまでクリアするのかまた悩みそうです。
退会済みユーザー

退会済みユーザー

2019/06/19 09:58

ん?ちょっと勘違いしているような気がします。 クライアント側の時間を POST させようとしているように感じました。 session['start_at']=セッション開始(更新)時のサーバの時間 みたいにして、 session['start_at'] とアクセス時のサーバの時間を比較してみては?という提案なんですけど、ずれてませんか?
hatsuzo

2019/06/19 10:28

コメントありがとうございます。 セッション開始時のサーバーの時間というのは、phpスクリプト上で、 $last_tm = $_SESSION['LAST_TIME']; $_SESSION['LAST_TIME'] = date("Y-m-d H:i:s"); // 時刻差(秒数) $diff_min = (strtotime($_SESSION['LAST_TIME']) - strtotime($last_tm)); if ($diff_min > 15){ header('Location: ss_timeout.html'); } という感じで、時間差を求めてますが、これはサーバ上の時間ということにならないのだとしたら、ずれてます。これはクライアント上の時間になるんでしょうか?
退会済みユーザー

退会済みユーザー

2019/06/19 10:30

サーバの時間でやってるみたいですね。 失礼^^;
hatsuzo

2019/06/20 01:01

とんでもないです。m(__)m 愚問に対してご丁寧に回答下さいまして有難うございました。
guest

0

今度は、時間経過前にセッションが切れた状態になってしまいます。

セッションクッキーの有効期間を確認してください。
https://thk.kanzae.net/net/itc/t4082/

投稿2019/06/18 09:13

hide0128

総合スコア245

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuzo

2019/06/18 23:32

コメントありがとうございます。 このページは調べている段階で見て参考にさせていただいているのですが、どうも使い方が判らなくて... もう一度、読み込んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問