発生した問題点:
- 時間のかかる非同期処理を実行 -> その処理が終了する前に画面遷移
- 画面遷移後、セッションを更新していると、前の画面の処理が終わった瞬間、セッション情報が古くなってエラーが発生
- どうやら、非同期処理で実行した処理が、バックで動き続け、画面遷移した後で終了したタイミングで上書きされる模様
セッションを使わずに処理を行うようにしたりとか、色々試しましたが、根本的な原因は「セッション処理は常に1つずつ」行われ、実行中はロックされるということ。
下記の記事が参考になりました。ありがとうございました。
「【ajax】複数のajax送信を同時に行ってPHPのセッションを扱うときの注意点」
「phpでajaxとsessionを使う時の注意点:なんとなしの日記」
対応策
「session_write_close」を使うこと。
- 現在のセッションを終了し、セッションデータを書き込む
- セッションは同時書き込みを防ぐため、スクリプトの終了まではロックされる
- セッションの処理ができるのは、常に1つだけ
- セッションの変更後にすぐにセッションを終了することで、ロック待ちによる遅延を防ぐことができる
過去に非同期で複数の処理を取得しようとして、遅延が発生していた件が思い当たりました…。これでしたか……。
非同期なのに、どうして遅くなるのか不思議でした。
問題のスクリプトのエラーは発生しなくなりました。
原因が分かりましたので、今後は積極的に利用していこうと思います。
コメント