[PHP-users 30492] Re: session_start()から先に進まない

donguri256 @ mac.com donguri256 @ mac.com
2006年 10月 11日 (水) 11:46:20 JST


質問者のどんぐりです。松本様ご回答ありがとうございます。


> まず第一にsession_start()するスクリプトがなんらかの事情 
> で長時間終了しな
> かった場合に、同一セッションIDでアクセスすると同様の症状 
> が発生すると思
> います。
> この理由はsession_start()はセッションファイルを 
> LOCK_EXでロックしますが、
> ロックが解除されるのはスクリプトの終了時だからです。
> この場合はapacheを再起動すれば一時的に症状が無くなると思 
> いますが、根本的
> には長時間スクリプトが終了しない事が問題だと思います。

セッションを使っている場合の「スクリプトの終了」とは、具体的にど 
んな状態を指しますでしょうか。

・スクリプトファイルを実行しきっており、セッションも明示的に 
(session_destory()など)開放された状態
・ブラウザウィンドウを閉じるなど、実行が中断され、同時にセッショ 
ンも暗黙的に開放された状態

私は上記2つだと思うのですが、どちらでもない状態(つまりス 
クリプトが終了していない状態)が長期間続くというのは、別に特殊な 
状況ではないような気がします。
セッションを開放(例えばログアウト)しないままブラウザも閉じず、 
長期間後に使うことは私はよくあります。
するとそのサービスでは一定時間操作していなかったので再ログインを 
要求してきたりしますが、本件のように先に進まないという状況になっ 
た経験はありません。

松本様のご指摘は、言い換えると
セッションファイルがロックされた後、そのまま長期間利用しないこと 
によりロック元のプロセス自身は存在しなくなり、再アクセスしたとき 
は違うプロセスが、自分がロックしたものと違うセッションファイルを 
開こうとしている問題、
と解釈してよろしいでしょうか。

仕様としては、ログインしっ放しにしておきたいのではなくて例えば 
30分間操作しなかったら再ログイン要求などしたいので、
session.gc_probability = 100
session.gc_divisor       = 100
session.gc_maxlifetime = 1800
などと必ず削除するようにすれば、関係のないセッションファイルを見 
に行けないので解決するのでしょうか。
試してすぐ結果を確認できる現象ではないので、早速設定して少し待っ 
てみます。
だとしても100%の確率でガベージコレクションとは聞いたことが 
ないですが。。

ロックが原因だとすると、「アクセスしてずっと待ってるとたまに開け 
る場合がある」のが気になります。


> 第二に、セッションファイルを設置するデバイスの可用性に問題があ 
> る場合に
> このような症状になるかも知れません。例えば/tmpが 
> NSFサーバーを利用して
> いて、NFSサーバーとの間に設置されているHUBが故障し 
> ていて、アクセスしに
> くくなっている場合等です。

折角ご考慮いただきましたが、セッションファイルの読み書きディレク 
トリはローカルホストにそのまま置いてあり、ご指摘のような問題はな 
さそうです。


---
どんぐり
donguri256 @ mac.com



PHP-users メーリングリストの案内