セッションとGCに付いての検証

このQ&Aのポイント
  • セッションとGCについての検証を行っています。セッションを1時間に1200本3秒毎にWSHを利用して張っています。
  • GCはスクリプトの実行終了時に処理が走ると思われます。マイクロタイムのdiffはセッションを純粋に張った時間しか求められません。
  • GCのトラフィックを図るための手段はないか検討しています。環境はphp4.3とLinuxです。
回答を見る
  • ベストアンサー

セッションとGCに付いての検証

こんにちは。 現在、セッションとGCに付いての検証を行っています。 セッションを1時間に1200本3秒毎に、WSHを利用して セッションを張っています。サーバー側で、セッションの 開始と、終了のところでPEARのTimerを使用して、マイクロタイム を取得しています。ですが、GCは、スクリプトの実行最中に 行われているとは思えません。かといって、クーロンで 動いているわけでもなさそうなので、スクリプトの実行終了時 にGCの処理が走ると思われます。となると、マイクロタイムの diffというものは、セッションを純粋に張った時間しか求められません。 GCのトラフィックを図るためにいい手段とはないものでしょうか? 因みに環境は、php4.3,linuxです。 宜しくお願い致します

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

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

  • ベストアンサー
noname#18290
noname#18290
回答No.3

>上記のようなケースの場合で、session.gc_probabilityを100%にすると、 >G.Cが行われるのは、スタートしてから、30分後になって、G.C対象は始めの10分に張った >セッションと言うことになりますよね? 100%だと実際は毎回、gcがcallされますが、セッションファイルの修正時刻と比較して削除されず、見かけ上は変化無しと言うことです。 ソースを追う限り、削除が遅れるケースはあっても早まるケースを想定できません。 (ext/session/mod_files.c:ps_files_cleanup_dir()) お役にたてず申し訳ない。

teraum
質問者

補足

>100%だと実際は毎回、gcがcallされますが、セッションファイルの修正時刻 >と比較して削除されず、見かけ上は変化無しと言うことです おっしゃるとおりです。言葉足らずで変な誤解を与えてしまいました。 >ソースを追う限り、削除が遅れるケースはあっても早まるケースを想定できません。 そうですか・・・・ ちょっと、テスト方法を再度見直してみます。 いろいろ有難うございました。

その他の回答 (2)

noname#18290
noname#18290
回答No.2

GCは何時開始されるかは、 ソースを読めばわかります。 該当する部分は、 php-4.x.x/ext/session/session.c の中の、 php_sesion_start()関数です。 なお、ドキュメントに記載があるかと言うと 十分ではありませんが、GCの発生率を決定付ける パラメータとしての記載ならあります。 php.iniのディレクティブ一覧が該当します。

teraum
質問者

補足

有難うございます。 ソースコードを読んでみました。 また、マンモス本にもセッションが開始されたときにガーベッジコレクション(以下G.C)が 開始されてその確率はsession.gc_probabilityが決めるとかいてありました。 有難うございます。 ついでに、もうひとつ聞いていいですか? ・セッションのライフタイムを30分 ・セッションを2秒に一回発生させてそれを40分間セッションを張りつづける 上記のようなケースの場合で、session.gc_probabilityを100%にすると、 G.Cが行われるのは、スタートしてから、30分後になって、G.C対象は始めの10分に張った セッションと言うことになりますよね? となると、10間に張るセッション数は300件なので テスト終了後のセッションファイルは 40分(1200本)-10分(300本)=900本 になるはずなんですが、なぜか、残った、セッションファイル数は800本ぐらいですし、 G.Cが発生したのも、正確に30分後ではありませんでした、(2分ぐらい早かった) もし、このような現象に対して、思い当たる節があれば教えていただきたいのですが・・・ 因みにこの現象はsession.gc_probabilityを100%,75%,50%,25%,1%にしても見受けられました。 ただし、1%の場合のみ、大体実行から、30分後にG.Cが発生してくれました。 宜しくお願い致します

noname#18290
noname#18290
回答No.1

GCは、garbage collectinのことですよね? PHPのgcは、どのタイミングで実施されるかと言えば、 明示的なセッションの開始session_start()を呼ぶか 暗黙のセッション開始session_register()が呼ばれた 際に php.iniで設定してある session.gc_probability = 1 session.gc_dividend = 1000 により決定されます。 この場合、gc_probability/gc_dividendの1000分の1 (0.1%)の確率で、実行されます。 単純に計るのではなく、複数のRequestの時間を loggingし、まったくgcを行わなかった場合との 比較をとらなければ、gcによる負荷は計測出来ない でしょう。 トラフィックは負荷の間違いですよね。

teraum
質問者

補足

回答有難うございます。 senberoさんは、ガーベッジコレクション(以下GC)がセッションの開始直後にphp.ini の設定により確率が決定されて行われるとありますが、それは、ドキュメント に明示的に記述されていたのでしょうか?私の調査不足かもしれませんが、 そのようなことが記述されていなかったような気がします。 信用してはいけないと思いますが、海外のサイトの掲示板を見ていて、 GCは、スクリプトの実行終了後と記述されてあった気がします・・・。 宜しくお願い致します。 >トラフィックは負荷の間違いですよね。 おっしゃる通りです。申し訳ありません。

関連するQ&A

  • 初歩的な質問 セッション管理について

    セッション処理をしたいと考えていますが、 分からない点が多く困っています。 したいと思っていることは、「ログイン」的な処理です。 訪問者がブラウザを閉じても、サイト設計者が設定した「期間」、 ログイン状態をキープさせておけるような仕様です。 ※よくあるタイプです。 (特段、難しいことや変わったことをしようとしてはいません。) ただ、ちょっと変わっている点は、ログインはパスワード無しで行います。 フォーム(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_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
  • セッションについて

    お世話になっております。 質問の多重投稿をお許しください。(重複ではありません。) Java EEのセッションについて質問です。 セッションの有効期限を設けた場合(仮に10分)、期限切れ直前に実行されたセッション処理はどうなるのでしょうか。 9分59秒に処理が開始され、たとえばその処理に1分かかるとすると、有効期限内に実行された処理のためその処理については最後まで実行されるのか、それとも期限時に処理が強制終了するのか。。 プログラムなので後者はあまり現実的な考えではないかなぁと思うのですが、いかがでしょうか。 実務的にはセッションリスナーなどで終了イベントを感知しそこにタイムオーバー時の例外的な処理を記述するというのが一般的なのでしょうか。。 質問仕方もレベルが低く申し訳なく思いますが、ご回答よろしくお願い致します。

    • ベストアンサー
    • Java
  • セッションが変数が取得できません

    こんにちは。初心者で大変申し訳ないのですが、2日間悩みましたがどうしても解決できないため質問させて頂きました。どうかご教授下さい。 PHPのセッション機能の利用をしようと以下のような環境でテストスクリプトを実行したのですが、うまくいきません。 PHPバージョン4.3.10 register_globals On session.auto_start Off session.bug_compat_42 On session.bug_compat_warn On session.cache_expire 180 session.cache_limiter nocache session.cookie_domain no value session.cookie_lifetime 0 session.cookie_path / session.cookie_secure Off session.entropy_file no value no session.entropy_length 0 session.gc_divisor 100 session.gc_maxlifetime 1440 session.gc_probability 1 session.name PHPSESSID session.referer_check no value session.save_handler files session.save_path /tmp session.serialize_handler php session.use_cookies Off session.use_only_cookies Off session.use_trans_sid On SESSION登録側スクリプト <?php session_start(); $_SESSION['tarou'] = 50; ?> <a href="test.php">test</a> 結果表示側スクリプト <?php session_start(); echo($_SESSION['tarou']); ?> session.use_trans_sid Onで透過的にURIにセッションIDを埋め込むタイプで、 セッションファイル自体は作られているのですが セッション変数は登録されておらず、空のセッションファイルとなってしまっています。 色々と調べてみたのですがどうしても解決できません。 大変お手数ですがどうか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • tomcatのセッションタイムアウト

    tomcatで構築されたWebアプリを検証しています。 Webアプリにログインし、何も操作せずにセッションタイムアウト時間の確認をしているのですが、 tomcatのセッションタイムアウトの設定値通りにセッションが切れません。 web.xmlの設定値は5分を設定しています。 大抵は設定時間+1分程で切れるのですが、 設定時間+3分ほど待ってみてもセッションが切れないケースがあり、原因がわからない状況です。 利用しているtomcatのバージョンは4.1.31です。 何かtomcatの仕様上でセッションタイムアウトの時間が変わるようなことがあるのでしょうか? 当方初心者のため、お手柔らかにお願いいたします。

  • セッションを奪った場合にスクリプトを実行する方法

    ADサーバおよびメンバーサーバがWindows Server 2008 R2の環境で、 ADサーバ側のグループポリシーで設定するログオンスクリプトによって ログオン情報(ログオン時間、クライアントのホスト名等)をテキストファイルに 記録するスクリプトを実行したいと考えております。 ※メンバーサーバには複数の端末、アカウントでログオンします。 現在スクリプトの検証をしており、サーバにアカウントAでログオンしている状態で 別端末から同じアカウントAで接続した場合、あとから接続した方がセッションを 奪うような形になりますが、その際はログオンスクリプトが実行されないため、 上記のログオン情報が記録できないことがわかっております。 セッションを奪ってログオンした場合に、特定のスクリプトを実行させるような 良い方法はありますでしょうか?

  • WSHスクリプトから動かしたEXCEL・VBAマクロでWSHスクリプトを停止する方法

    WSHスクリプトからEXCELファイルのVBAマクロを呼び出し実行させます。 このマクロ内ではif関数で設定している条件の真偽を判定しています。偽の場合、マクロは終了しEXCELファイルは一旦閉じられます。そして一定時間がたったら、WSHスクリプトのループ処理で再び同じマクロが開かれif関数で条件判定を行います。 もし、真の場合、マクロの設定処理の実行・終了とともにWSHのループ処理も終了させたいのですが、VBAマクロからそのマクロを実行させているWSHスクリプトを停止させることは可能でしょうか。

  • 思うように セッションの破棄 ができない

    ASPを使ったログイン機能を持ったページを作っています。 ログインしたときにセッションIDを使って直リンクを避けるような 機能を持たせたのですが、サーバーの負荷を避けるために、ログアウト ボタンを作って ログアウトボタンを押したらセッション情報を破棄 するようにしたら、どうもページを読み込んだときに すぐに破棄してしているようで うまくできません ソースは <%@ Language = "VBScript" %> 以下HTMLヘッダー類 <script language="JavaScript"> <!-- function owari(){ <% Session.Abandon %>//セッション破棄 parent.location.replace('../login/login.asp?stn=2');//ページ移動 } //--> </script> 以下HTMLのボディー <INPUT type="button" value="ログアウト" onclick="owari()"> 以下色々なソース ボタンを押したら JavaScriptを呼び出し 破棄してページ移動するように作ったのですが これ自体は問題なく作動するのですが、 <% Session.Abandon %>//セッション破棄 がはいると、なぜかページを開いたときに 呼び出してもいないのに 破棄されてしまっているようで、通常のページ移動もできなくなります セッション破棄の1行を抜くと 全てきちんと作動しますが これではサーバーのセッションタイムアウトまでメモリが残るから良くないのです。 また、VBScript内に Sub haki() Session.Abandon .. .. End sub として <script language="JavaScript"> <!-- function owari(){ <% haki %> } //--> </script> と言うようにしても、同じ不具合になります JavaScriptはfunctionにすると呼び出されるまでは実行されないと思います。 またVBScriptのSubプロシージャも呼ばれるまでは実行しないと思っています。 ただ、今の状態を見る限り、このあたりの認識が間違っているのかなと思っているのですが、 根本的な原因とその解決策が分からず困っています。 どなたかご教授くださいますと幸いです。 よろしくお願いします

  • ■(ログイン)セッションの有効期限の設定法について

    いつも、お世話になっております。(PHP5.2.5) セッションの有効期限の設定方法について色々調べましたが、 解決できなかったため、質問いたします。 --- 例えば、 a.phpと、b.php、2つのスクリプトファイルからなるサイトにおいて、 a.php、b.phpどちらにおいても、スクリプトソース冒頭で、 //(1)サーバ側のセッションファイルの有効期限を(少なくとも)24時間に設定 //有効期限が過ぎた後は、ある一定の確率でGCが起動しファイルを削除 ini_set('session.gc_maxlifetime', 86400); //(2)クライアント側のクッキーファイルの有効期限を24時間に設定 session_set_cookie_params(86400,"/"); //(3)セッションIDを生成、付与 session_start(); とし、 さらに、その上で、 IDとパスワードの入力に成功した場合に、 ログインさせ、その状態をセッション値に入れます $_SESSION['login'] = 'login'; --- 以上の経路をたどった場合の「ログイン持続期間」は、 24時間となると私は考えていますが、違いますでしょうか? しかし、実際には、1時間も持ちません。 (ちょくちょくサイトにアクセスしていると、1時間以上持つようなのですが。 ※つまり、期限が更新(延長)されているんでしょうかね。) で、どうして意図した通りに動かないのかを調べようと、 firefoxにて、クッキーの有効期限を確認すると、 (2)の処理がうまくいっているせいか、 こちらの有効期限は意図通りに設定されています。 よって、意図通りに機能しない原因は、 サーバ側のセッションファイルの有効期限が うまく設定されていないからなのでは、と思っています。 つまり、(1)の処理がうまく出来ていないことが予想されます。 はてさて、どこに問題があるのか…。 また、このサイトの例において、 もし仮に私の意図した通りの設計となった場合には、 アクセスの度に、その有効期限を24時間延長するような処理になるのでしょうか? 以上、どなたかどうかアドバイスを宜しくお願い致します。 --- なお、 セッション値に「time()」を格納し、 その時間をもとに、ログイン期限を設定し、 ログイン時からの経過時間と、その期限とを比較して、 ログイン状態を継続(延長更新?)させるか、切断するかを毎回判断させる、 なんていう方法もありそうですが、 その場合にしても、 結局は、サーバ側のセッションファイルの有効期限の持ちが悪ければ、 同様に、うまくいかないはずだと私は考えています。

    • 締切済み
    • PHP
  • マイコンで経過時間のカウント

    マイコンで所定時間経過したかどうかを判断するとき、 下記の2パターンがあると思います。 例えば、マイコンで有名なR社さんのマイコンセミナーでは②で説明していました。 私は②に慣れています。 お互いのメリットデメリットを教えてください。 また、どちらがおすすめなのでしょうか? ①開始時間time1と現時間time2との差分で経過時間を判断する方法。  例えば、arduinoとかでのmills()関数を使用した方法。  time1 = mills();  /*何らかの処理*/  time2 = mills();  time_diff = time2 -time1; /*経過時間*/ ②ある変数timerを1秒ごとに減算して0になったかで判断する  例えば、1秒割込みで   if(timer > 0){ timer--; }  を実施し、  その後、   if(timer == 0){  で比較する。

専門家に質問してみよう