2006年04月30日

セッションデータのロックと競合

PHP でセッションを使っていると、同じ session id を使用する同時アクセスは、セッションデータへのアクセスが競合するため、一方のアクセスによるセッションデータのロックが解除されるまで、もう一方は待たされてしまいます。

同じ session id を使用する、ということは、1台のコンピュータから同じブラウザを使って web アプリケーションにアクセスする、ということですから、通常ならユーザが複数のウィンドウを開くか、フレームを使用したデザインでないと、同時アクセスは起きませんでした。

しかし Ajax を使うようになると、一つのウィンドウから複数のサーバアクセスが同時に発生することがよくあります。

私のアプリケーションでも、複数の Ajax アクセスが一つずつにしか実行されないという現象が起きて、なんでかな〜と思ったらこのセッションが原因でした。

session_write_close() を呼び出してやらないと、sesson_start()して(session.auto_start がセットされていればリクエスト開始時)から、スクリプトの実行が終了するまで、セッションデータがロックされてしまいます。

うちのアプリケーションの場合、セッションデータの変更を行う箇所はある程度絞れたのですが、コードのあちこちで読み出しています。PHPマニュアルの session_write_close() の項を見ると、
session_write_close -- セッションデータを書き込んでセッションを終了する
とあります。ということは session_write_close() を実行した後はセッションデータが必要になるたびに sesson_start() しなければならないのでしょうか?

この辺のドキュメントが見つからなかったので、試してみました。すると、一旦 session_start() して session_write_close() した後でも、セッションデータは $_SESSION['xxx'] で利用することができました。(もちろん、その後の変更は保存されません)

ということで、うちのアプリケーションの場合は、セッションデータの書き換えが終わったらすぐに session_write_close() することにより、複数の Ajax アクセスに対するレスポンスをかなり改善することができました。
posted by Kojima at 07:06| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。