【ajax】複数のajax送信を同時に行ってPHPのセッションを扱うときの注意点
ajaxでは非同期通信を行えるので、一つのajax送信を実行しつつ別のajax送信も同時に行なえます。
そのため1つのページを閲覧中に複数のページにデータ送信を行い(複数のプログラムを走らせ)、その結果をページに出力できます。
この便利な機能をフル活用していたのですが、PHPのセッションへのアクセスでハマったことがあったのでメモしておきます。
複数のajax送信を同時に送信
ajaxは非同期通信なので、同じ処理ページに複数のajax送信を同時に行うことが可能です。
そのため、「ajax送信A」「ajax送信B」「ajax送信C」の3つを同時かつ同一のページ「hoge.php」に投げ、その結果を取得してページに表示する次のようなプログラムが可能です。
「ajax送信A」「ajax送信B」「ajax送信C」でそれぞれ「hoge.php」にデータ送信
↓
データを受け取った「hoge.php」は処理を開始
↓
session_start関数でセッションを開始して
処理した情報の一部をセッションに保存
↓
(けっこう長い処理)
↓
処理結果をそれぞれの呼び出し元に返す
↓
ページに結果を出力
そもそもなぜこのようなプログラムを例として出したのか?についてですが、【ajax】非同期通信をフル活用して処理時間を短縮できた話にあるように処理時間の短縮を行いたかったからです。
実際にこのやり方で処理速度は向上したのですが、上の赤文字部分にあるようにセッションの仕組みを導入した途端、処理速度が極端に落ちました。
なぜ処理速度が落ちたのか?
処理速度が落ちた原因ですが、PHPのセッション処理の仕様が原因でした。
PHPのセッションについて
PHPのセッションはサーバー内にあるファイル(セッションデータ記録用のファイル)で管理されており、
session_start();
でセッションが開始されると、セッションファイルは処理が終了するまでロックされ、別のプログラムによるそのセッションへのアクセスはできなくなります。
別のプログラムがそのセッションへアクセスできるときはいつか?それは最初にセッションファイルを開いたプログラムが終了した時です(そのときにセッションファイルのロックが解除されます)。
つまり、あるプログラム処理がセッションにアクセスしている場合、別のプログラム処理はその処理が終わるまでセッションにアクセスできず、待機時間が発生します。
これが処理速度が落ちた原因でした。
セッションへの同時アクセスが原因
つまるところ、複数のajax送信を行ってPHPでセッション処理をゴニョゴニョ行う場合、セッションへの同時アクセスが発生します。
この『セッションへの同時アクセス』が発生した場合、セッションファイルのロックが解除されるまで後続のプログラム処理は待たされてしまいます(待機時間が発生する)。
したがって『セッションへの同時アクセス』が発生しないように対処する必要があります。
セッションへの同時アクセスを回避する方法
その方法はとっても簡単で、セッションの取得や書き込みが終わったらすぐにsession_write_close関数で明示的にセッションを閉じるようにすればよいです。
これだけでセッションへの同時アクセスを回避できます(セッションの読み書きは一瞬で終わるため)。
session_start関数でセッションを開始
↓
セッションの読み取りやセッションへの書き込み
↓
そのほかの処理
↓
プログラム終了(ここでセッションファイルが閉じられる=セッションファイルのロック解除)
となっているのを、
session_start関数でセッションを開始
↓
セッションの読み取りやセッションへの書き込み
↓
session_write_close関数で明示的にセッションを閉じる(セッションファイルのロック解除)
↓
そのほかの処理
↓
プログラム終了
とすればよいです。
具体的な方法
具体的には、次のようにします。
<?php //セッションスタート session_start(); //セッションへの書き込み $_SESSION['session_number1'] = "hogege"; //これ以降セッションを読み書きしない場所では必ずsession_write_close関数で明示的にセッションを閉じる session_write_close(); ?>
このようにすれば、セッションへの同時アクセスを回避できます。
参考サイト
あわせて読んでほしい!
コメント
まだコメントはありません。