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

donguri256 @ mac.com donguri256 @ mac.com
2006年 10月 14日 (土) 16:47:12 JST


質問者のどんぐりです。

> ひとつのPHPスクリプトが始まったら、スクリプトの終了まで
> プロセスIDは代わらないと思います。よって、1回のリロード
> で、同一セッションIDを利用する複数のPHPスクリプトをほぼ
> 同時にリクエストしていると考えるのが素直な結論なのですが、

ちょうど今も現象再現したので試していたのですが、
>>  httpd   5369  www   /private/tmp/sess_ds5******avu
>>  httpd   5377  www   /private/tmp/sess_ds5******avu
のように異なるプロセスが同セッションファイルを取り合う(?)ことがあるのは間違いないのですが、これは問題の「切っ掛け」ではないような気がしました。
というのは、「"セッションファイルとして存在しない"セッションIDを持っている」状況を今確認したからです。

/private/tmp/sess_* が幾つか存在したのですが、Cookieで確認したセッションIDを持つファイルがありませんでした。
リロードするうちに、そのセッションIDを持つファイルが作成されましたが、catすると中身は空でした。
それでもリロードしていると、今度は今朝メールしましたように複数プロセスがそれを取り合っていました。


ご指摘の「環境」ですが、

> フレームやインラインフレームを利用していたり、
> PHPスクリプトで画像やJavaScript、CSS等を出力している場合、
> このような現象が起きるかも知れません。AJAXになると

フレーム、画像生成、Ajaxは使っていません。CSSは普通に読込みのみ使っています。
JavaScriptは、読込み以外に生成もしています。
Smartyを使っているのですが、PHPでJavaScriptコードを動的に生成してテンプレートにはめ込んでいます。
また、多くのページでブラウザレベルのキャッシュ
 header( 'Cache-Control: public, max-age='.$cacheTime );
 header( 'Pragma: ' );
を利用しています。
その他ADODB経由でPostgreSQLを使ったりなどです。

いま気になったのは、開発環境と本番環境を分けていることです。
2台のマシンへポートを変えて同URLでアクセス、
 http://example.co.jp:80 → 本番環境マシン:80
 http://example.co.jp:8080 → 開発環境マシン:80 へフォワード

いま開発環境マシンからブラウザで両サイトにアクセスしたところ、開発環境のほうで現象再現していました(これはたまたまで、どちらでも再現します)。
Cookieで確認したところ、同じセッションIDを持っていました。
それで、本番環境ではそのセッションIDのセッションファイルが存在したのでアクセスでき、開発環境ではそのセッションIDのセッションファイルが存在しませんでした。

セッションIDの生成は、現実的なレベルではユニークになるはずだと思っているのですが、どういう理屈で両サイトが同じセッションIDを持っているのでしょうか。。



> 動作試験用にアクセスしたIPアドレスでApacheのログを
> grepすると、どうなるでしょうか。

Apacheログについては、アクセスログ、エラーログ共に、この問題については一切のロギングはされていません。


セッションIDのことについて調べてみます。


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



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