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

Reiji Matsumoto matsumoto @ spline.oc.to
2006年 10月 15日 (日) 06:18:44 JST


こんにちは。松本です。

> 不勉強ですみませんが、JavaScriptを生成して出力する
> 際に併せてセッションを開始することが、どう関連して
> くるのか想像がつかないのですが、それはどういった問
> 題になるのでしょうか。
[PHP-users 30510]の「おかしな動作」の裏取りのために、
お尋ねしました。「おかしな動作」はHTMLとJavaScriptがほ
ぼ同時にリクエストされるので、普通の動作のようですね。

>したところセッションIDの重複はなく、またどちらもCookie
>に保存されているセッションIDと実際に存在するセッション
>ファイル名は一致しているのですが、先に進みません。

今の段階の予測をまとめますと、以下のようになります。
-------------------------------------------------------
「障害A」が発生し、長時間終了しないスクリプトがある。
そのスクリプトはセッションファイルを長時間オープンして
しまうので、同一セッションで他のページを開いたり、リロー
ドしたりする事ができなくなる「障害B」が発生する。
-------------------------------------------------------
という感じです。

ですので、lsofで見てセッションファイルが同時に開かれて
いない状態は、「障害A」が発生している状態とは考えられ
ないでしょうか。

>10秒程経ってもう一度開いているファイルを確認したら、
>プロセスが増え、複数プロセスが同一セッションファイル
>を見ていました。

一方、これについては「障害A」から派生する「障害B」
であり、セッションがロックされているから先に進めない。

つまりsession_start()で止まってしまうというのがこの
スレッドの元の質問でしたが、これは付随的な現象で、実際
には「障害A」の方が問題として大きいわけです(と、予測する)。
よって今後の方針としては、もし止まってしまったらlsofで
セッションファイルのオープン状況を確認。その時2つ以上の
プロセスでセッションファイルを開いていたら、それは
「障害B」が発生している。セッションファイルをオープン
しているのが1つだけなら「障害A」が発生している状態で
あると仮定し、調査を行う。

という感じで進められたら良いと思います。「障害A」が発生し
ている時は、session_start()ではなく、別の所で止まっている
かも知れません。その箇所が見つけられれば、問題解決に近づく
と思います。
具体的な方法ですが、gdbを使ってみると良いと思います。
「障害A」の発生時に、

gdb /[apacheのパス]/bin/httpd
(gdb) attach [「障害A」発生中のhttpdのPID]
(gdb) bt

と、した時、どのような表示になりますか?

注:gdbは本番サーバーで実行しないで下さい。




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