カレンダー

11 | 2016/12 | 01
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

広告



最近の記事

カテゴリー

DATE: CATEGORY:DEV


phpでajaxを使ってたんですが、session周りで
発見があったので、覚書としてメモっておく。

やろうとしたこと


King of the Hill....
Photo:King of the Hill.... By law_keven

1つのページ内で一部分をajaxでロード(loading.php)する。
ただ、この処理が時間がかかるため、そのロード状況の進捗を定期的に
ajaxでチェック(loadingCheck.php)しようとした。

イメージはこんな感じ。

ページ内で一部をロード結果を応答するphp

<?php
session_start();

for(){
色んな処理(長め)を実施

処理の進捗をセッションに格納
}

処理結果をjsonpで吐き出し
?>

処理の進捗結果を応答するphp

<?php
session_start();

セッション情報を取得

セッション情報から進捗状況を取得

進捗状況をjsonpで吐き出し
?>

が、実は、この処理うまく動きません。動きとしては、
定期的にリクエストするloadingCheck.phpからの応答が
返って来ません。

なんでかと思って繰り返していると、どうやらloading.phpの
処理が完了するまで、loadingCheck.phpが応答しない様子。

原因は、session管理は2重で処理できないため


この処理がうまく動かない理由は、
session管理は2重で処理出来ないため。
これが落とし穴でした。

もっと言うと、同一ブラウザ(同じセッション情報)からのリクエスト
に対して2重アクセスは出来ないんです。なので、通常のWebアプリで
あれば問題ありませんが、ajaxで非同期通信をした時に問題になるんですね。

もう少し詳細を説明


概要を説明すると、最初にクライアントから「loading.php」が
呼び出されて、session_start();が開始します。実は、この時点で
セッションファイルがロックされます。

そのため、「loading.php」の処理中に進捗チェックのリクエストが来て、
「loadingCheck.php」が呼び出されて、session_start();が呼ばれますが、
既にセッションファイルがロックされているため「loadingCheck.php」
のsession_start();の処理は、ロックが開放されるまで待ちます。

では、ロックが開放されるのは、いつなのか。
予想通り、答えは、loading.phpの処理が終わったら。
なので、loading.phpの処理が終わるまでloadingCheck.phpは
応答を返さないんですね。

対処方法


原因がわかれば、対処法。

セッションファイルがロックされている事が原因なので、
php全体の処理がすべて完了する前にロックを開放しましょう。

処理が終わる前のロック開放はsession_write_close関数で行えます。

これを使ってセッションファイルを早めに開放するように
こんな風に変更してみました。

ページ内で一部をロード結果を応答するphp

<?php
session_start();

処理の進捗情報を格納する外部ファイル名を格納

session_write_close();

for(){
色んな処理(長め)を実施

処理の進捗を外部ファイルに格納
}

処理結果をjsonpで吐き出し
?>

処理の進捗結果を応答するphp

<?php
session_start();

セッション情報から外部ファイル名を取得

外部ファイルから進捗状況を取得

進捗状況をjsonpで吐き出し
?>

これでうまく取得出来るようになりました。

もっと細かく、start&closeを繰り返してもいいのかも。

以上。

タグ : php ajax session 2重 jsonp

Comment

大変参考になる情報、ありがとうございました

コメントの投稿

管理者にだけ表示を許可する


トラックバック


この記事にトラックバックする



copyright © なんとなしの日記 all rights reserved.
内職☆在宅ワークの最強は?アフィリエイト!. 初心者だってカッコ良いホームページ作るぅ!
Powered by FC2ブログ
Related Posts Plugin for WordPress, Blogger...