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

donguri256 @ mac.com donguri256 @ mac.com
2006年 10月 14日 (土) 10:07:27 JST


質問者のどんぐりです。松本様、ご丁寧なお返事をありがとうございます。
再現が不定でなかなか確認ができす、返信遅れましてすみません。


> ・まずIE6を1つ開き、1.phpを実行する。
> ・"1.php complete"と表示されたら Ctrl+Nを押し、別ウィン
>  ドウを開く。新しく開いたウィンドウのステータスバーには、
>  約30秒後に"ページが表示されました"と表示される。
> ・2つのウィンドウのステータスバーが同時に見られる
>  ように、ウィンドウ位置を調節する。
> ・最初から開いていたウィンドウをリロードし、1.phpを
>  もう一度キックする
> ・新しく開いたウィンドウのアドレスバーに30秒以内に
>  "http://ドメイン/2.php"と入力し、2.phpを実行する。
> ・すると、2.phpにはウェイトが無いにも関わらず、ほぼ同時
>  に新旧のウィンドウの読み込みが終了する
>
> と、なると思います。

上記の手順で、仰る通りの動作を確認しました。


> セッションIDに関連付けられたファイルをオープンしているhttpd
> が2つ以上あるとしたら、1つは今ブラウザで開いているスクリプ
> トで、もうひとつは何等かの理由で終了しきれていないプロセスの
> 可能性があり、私の仮定の可能性が高まります。

これについても、ご指摘のとおりの状況を確認できました。
すると次は、終了し損ないのプロセスが、何故終了し損なったままなのかという問題ですね。

問題の発生しているスクリプトでは、例えば大きなファイルのアップロードのように長時間の処理を要する機能というか個所はありません。一番長い個所でも、DBから値を取ってきてPHP側にてループで成形して表示までの2〜3秒間くらいです。
いまのところは、プロセスの終了に失敗しそうな個所に心当たりがありません。
そもそも、これはプロセスの終了の「失敗」なのか、残るべくして残っているのかも、判断できません。

Apache側の設定で、使い終わって時間の経つプロセスを強制的に掃除してもらえないかとも考えたのですが、終了に失敗している状況だと、「使い終わった」と認識してくれるのかどうかもわかりませんね。
まずは、httpd.confのことについて改めて調べてみます。


それと、以下はおかしな動作なのかわかりませんが、、
session_start()で止まっている最中に
 lsof -c httpd | grep sess
としていると、最初は
 httpd   5369  www   /private/tmp/sess_ds5******avu
 httpd   5377  www   /private/tmp/sess_ds5******avu
のように表示されました。
少し経って、まだ進まないのでもう一度見ると今度は
 httpd   5371  www  /private/tmp/ess_ds5******avu
 httpd   5376  www  /private/tmp/ess_ds5******avu
と表示されました。
プロセス番号が違います。これ自体はおかしなことではないのでしょうか?

一度タイムアウトしたのでリロードしました。まだ進みません。そのとき今度は
 httpd   5371  www  /private/tmp/ess_ds5******avu
と表示されました。
プロセスが1つになり、それはさっき動いていたやつです。
少し経って、まだ進まないのでもう一度見ると今度は
 httpd   5384  www  /private/tmp/ess_ds5******avu
と表示されました。またプロセス番号が違います。
次のリロードでは何事もなく普通にページが表示されました。。


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



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