スレッド表示 | フラット表示〕 全トピック 920 件中 722 番目 次≫ ≪前

セッション変数が消えてしまいます

created: 2003-11-26 22:03 | modified: 2003-11-27 18:22 | reply: 14

[1094] セッション変数が消えてしまいます

user: かずま | created: 2003-11-26 22:03
はじめまして。かずまと申します。
実は、セッション変数が突然消えてしまう現象に悩んでいます。中身の値ではなく、変数そのものが消えてしまうのです。
作成しているアプリでは、ログインした人に発行したセッション変数が存在するかを随時チェックしているのですが、ブラウザを複数立ち上げていくと、最後に立ち上げたブラウザ以外のブラウザのセッション変数が全て消滅してしまいます。
この現象が起こるブラウザ数は一定ではありません。10?20個の場合もありますし50以上の場合もあります。
この現象について助言をいただける方、どうかよろしくお願い致します。
PHPのバージョンは4.1.1
Windows2000 & IIS上で動かしています。
reply: 1095 返信 編集 削除

[1095] 24分(1440秒)

user: ゆうじ | created: 2003-11-26 22:20
セッション変数を格納したファイルは
デフォルトだと24分で消される運命にあるのですが、
こういうことではないのでしょうか。

session.gc_maxlifetime = 1440
http://www.php.net/manual/ja/ref.session.php

この前書いたメモもご参考になれば。
http://www.sound-uz.jp/php/archives/memo/session_login.txt
Parent: 1094  reply: 1096 返信 編集 削除

[1096] セッションIDは保持されているのです

user: かずま | created: 2003-11-26 22:27
ゆうじさん、ご回答を本当にありがとうございます。
さっそくお教えいただいたメモを拝見させていただきました。
セッションIDは保持されているようなのです。また、私の環境も24分の設定ですが、そんなに長い時間はかかりません。また、消えるときは一斉に(立ち上げてる数十個のブラウザ分がいっぺんに)消えてしまうのです。
session_register()を使用していますが、過去のログを拝見させていただいたところ、左記関数はセキュリティ面で問題はあるが、突然消えるという情報は見当たりませんでした。
upload_tmp_dir = c:\winnt\tempとしていますが、OSやIIS上にも関連しているのでしょうか。。
Parent: 1095  reply: 1097 返信 編集 削除

[1097] session.save_path = /tmp

user: ゆうじ | created: 2003-11-26 22:42
> upload_tmp_dir = c:\winnt\temp

セッションファイルを保存するパス設定は、
php.ini の session.save_path ですが、
これは違うようですが・・・、

php.ini のセッション部を見せていただいてもいいですか?
Parent: 1096  reply: 1098 返信 編集 削除

[1098] 失礼しました。こちらです↓

user: かずま | created: 2003-11-26 22:52
先ほどのカキコはコピー元の誤りでした。すみません。
**************************
[Session]
; Handler used to store/retrieve data.
session.save_handler = files

; Argument passed to save_handler. In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
;session.save_path = /tmp
session.save_path = c:\winnt\temp

; Whether to use cookies.
session.use_cookies = 1


; Name of the session (used as cookie name).
session.name = PHPSESSID

; Initialize session on request startup.
session.auto_start = 0

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0

; The path for which the cookie is valid.
session.cookie_path = /

; The domain for which the cookie is valid.
session.cookie_domain =

; Handler used to serialize data. php is the standard serializer of PHP.
session.serialize_handler = php

; Percentual probability that the 'garbage collection' process is started
; on every session initialization.
session.gc_probability = 1

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

; Check HTTP Referer to invalidate externally stored URLs containing ids.
session.referer_check =

; How many bytes to read from the file.
session.entropy_length = 0

; Specified here to create the session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; Set to {nocache,private,public} to determine HTTP caching aspects.
session.cache_limiter = nocache

; Document expires after n minutes.
session.cache_expire = 180

; use transient sid support if enabled by compiling with --enable-trans-sid.
session.use_trans_sid = 1

url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
*****************************
エクスプローラを立ち上げて、新しいブラウザでログインするたびにc:\winnt\tempにセッションのファイルができる様子を見ていたのですが、やはりファイルが突然消えました!
ほとんとのファイルがいっぺんに消えることもあればそうでない場合もあって、まだよく再現性をつかむことができません。。
Parent: 1097  reply: 1099 返信 編集 削除

[1099] PHP4.1.2では再現しませんでした。

user: ゆうじ | created: 2003-11-27 00:44
win2000+Apache1.3.28+PHP4.1.2
session.save_path = c:\tmp\s412
とし、他は同じ設定という環境で、
簡単なコードでテストしてみましたが、
私のところでは再現しませんでした。
設定は問題ないようです。うむ、これは難しい・・・。

はじめに気づくべきでしたが、
c:\winnt\temp が Windowsのシステムフォルダー内にあるので、
PHP以外の原因も考えられますね。
まずは、PHP or PHP以外の切り分けが必要です。

session.save_path = c:\winnt\temp
これを、システムフォルダ外の
session.save_path = c:\temp\sess
のようにしても同じ現象ならば、
PHP側に原因があると考えられます。

これで再現しないようでしたら、OSや他のアプリケーションで、
c:\winnt\temp 内を定期的に削除するタスクが
走っている可能性があるのではないでしょうか。
Parent: 1098  reply: 1100 1101 返信 編集 削除

[1100] php.iniの値を変更してみます

user: かずま | created: 2003-11-27 01:05
「セッションの切断に関するメモ」を読みながら帰宅してきました。明日はまず、session.gc_divisor や session.gc_maxlifetime の値を変更して検証してみたいと思います。
ちなみに、session.save_pathはc:\php_sessとして試みたのですが、結果は同じでした。
また、ご報告します。
Parent: 1099  返信 編集 削除

[1101] $_SESSIONについて

user: かずま | created: 2003-11-27 11:59
gc_probabilityやgc_maxlifetimeを変更しても「セッションIDのファイルが突然消える」現象は変わりませんでした。
また、環境もwin2000+Apache1.3.28+PHP4.1.2
で行いましたが、結果は同じでした・・。
ところで、sesion_register関数を使わずに$_SESSIONを用いてテストしてますが、リロードの度にセッション変数を保持していないようなのです。基本的なことをお聞きするようで申し訳ないのですが、以下のソースに誤りはあるでしょうか?
期待する動作は、ブラウザの更新ボタンを押す度にloginの値が増えていくというものです。
****************************
session_test.php
****************************
<?php
session_start();

if(isset($_SESSION["login"])){
$_SESSION["login"]++;
print "<br> login = ".$_SESSION["login"];
}else{
print "<br>Hello";
$_SESSION["login"] = 0;
}

?>
****************************
Parent: 1099  reply: 1102 返信 編集 削除

[1102] コードは良いようです。

user: ゆうじ | created: 2003-11-27 13:07
返事遅くなりましてすみません。

今出先で、WinXP+Apache1.3.28+PHP4.3.3 という環境なのですが、
挙げていただいたコードは動きましたので、
まったく問題無いと思います。

挙動からすると
session.use_cookies = 0
または、ブラウザのクッキーがOFFで、
同じ現象になります。
リロードの度にセッションファイルが増え続けてはいませんか。

もう一度この設定を
確認した方がいいかもしれません。

私のほうは平行して、
PHP4.1.1でセッション周りのバグが
無かったかどうか調べてみます。
Parent: 1101  reply: 1103 1104 返信 編集 削除

[1103] 現象

user: かずま | created: 2003-11-27 13:34
session.use_cookies = 1
となっています。
また、リロードの度にセッションファイルは増えません。
現在のPHPは4.1.2です。

先ほどのコードでは以下のような現象が起きます。
エクスプローラでセッションファイルの追加削除が常時見れるようにします。
先ほどのコードでブラウザを5つ順番に起動していきます。(セッションファイルも順に増えていき、5個になります)
5つのうちどれかのブラウザの更新ボタンを連打します。
すると、連打しているブラウザ以外のブラウザのセッションファイルが一度に(一瞬で)消えてしまいます。
この間、24分は経っていません。
Parent: 1102  返信 編集 削除

[1104] 現象2

user: かずま | created: 2003-11-27 14:41
PHPを4.2.3に入れ替えて先ほどのコードを動かしてみました。
そうしますと、loginの値は増えていき、$_SESSIONは期待通り機能しました。

しかし、上記コードで複数ブラウザを上げ、任意のブラウザの更新ボタンを連打すると、他のセッションファイルが突然なくなってしまう現象は変わりません。

現在は再びPHP4.1.1+IISの環境に戻しています。
Parent: 1102  reply: 1105 返信 編集 削除

[1105] Fixed a crash in the session module

user: ゆうじ | created: 2003-11-27 16:24
PHP4の更新ログ
http://www.php.net/ChangeLog-4.php
ここの Version 4.1.2 に、
・Fixed a crash in the session module
というのがありました。

どのBugFixが元ネタなのかレポートを探してみましたが
見つけることが出来ませんでした。
詳細はわかりませんが、
「crash」ですので、相当に致命的なようです。

原因究明にはなってませんが、
バージョンアップを検討した方が得策かもしれません。

セッションファイルが突然なくなってしまう件は、
引き続き調べてみます。

追記:
http://ns1.php.gr.jp/pipermail/php-users/2002-March/006273.html
この一連のスレッドで
似た現象について発言されています。
参考まで。
Parent: 1104  reply: 1107 返信 編集 削除

[1107] 似てますね。

user: かずま | created: 2003-11-27 17:50
お教えいただいたスレッドの$_SESSIONが使えなくなる現象は確かにそっくりです。
私の場合、この件については4.1.1→ 4.1.2 → 4.2.3 → 4.1.1 とインストールを繰り返すうち、『なぜか』直ってしまいました。
しかし、セッションファイルが消滅する現象はあいかわらず起こっていたので、しかたがないのでシステム側に応急措置を加えました。そしてそれをテストしようとしたら、今度は再現しないのです!
消えてくれないと応急措置が正しく動作するかわからないのに。。。。。。

連携しているnamazuとの関係で、なるべくならPHP4.1.1で解決したいのですが・・。
Parent: 1105  reply: 1108 返信 編集 削除

[1108] 途中ですみません。

user: ゆうじ | created: 2003-11-27 18:08
> 『なぜか』直ってしまいました。
!?

> 連携しているnamazuとの関係で、なるべくならPHP4.1.1で解決したいのですが・・。

他のアプリとの兼ね合いがあるのですね。
引き続き調べてみましたが、新たな収穫はありませんでした。
このあたりが私のスキルの限界のようです。

途中ですみませんが、また再現するようなら、
php-users-ML で情報提供を仰いだほうが良いと思われます。
Parent: 1107  reply: 1109 返信 編集 削除

[1109] 本当にありがとうございました。

user: かずま | created: 2003-11-27 18:22
PHPの入れ替えを数回したものの、結局もとのバージョンに戻っているのに現象が出なくなってしまったので、心当たりがないのに直ってしまったという『なぜか』です。(^^;
結果よければそれで良し、とも言いますが、やはり気持ち悪いです。

応急措置は、あまりやりたくはなかった対策なのですが、セッション変数をログイン直後にDBに書き込みました。
セッションのファイルは消えてもセッションIDはメモリ上に残っていることがわかったので、例の消滅が発生した際、その場でsession_id()関数で現在のセッションIDを取得し、それをもとにDBを読み、存在すればそこからログイン時の内容を読み込むようにしました。

そうですね、php-users-ML等もご利用させていただこうかと思います。

それにしても、今回はセッションについて少し知識をつけることができました。ゆうじさんの検証結果をふまえながら作業ができたので、本当に助かりました。ありがとうございました。
Parent: 1108  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 722 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑