Laravel5.3です。
異なるリクエストにおいて、それぞれのリクエストに応じた異なるセッション変数を保存しています。
同一ブラウザで複数タブを開き、それぞれのリクエストを並列に送信してセッション変数の値を表示したところ、一方のリクエストで更新して保存したはずの変数が、更新前の状態に戻ってしまう事象が発生しました。
それぞれのセッション変数を正しく維持できる方法がございましたら、ぜひともお教えいただけますでしょうか。
###検証した内容
以下の2つの処理を用意しました。
- リクエスト_slow:完了まで10秒かかる処理。セッション変数"slow"にリクエスト回数を保持。
- リクエスト_fast:すぐに終わる処理。セッション変数"fast"にリクエスト回数を保持。
それぞれの処理は、セッション変数に処理を行った回数を保持します。
「リクエスト_slow」に1回アクセスすると10秒間レスポンスに待ちが発生するため、その間に別タブを開いて「リクエスト_fast」に10回アクセスしてみました。
- リクエスト_slow の結果:カウンタ=1 と表示
- リクエスト_fast の結果:カウンタ=1, 2, ・・・ , 10 まで順次表示
この後、「リクエスト_fast」のタブを再度リロードすると、カウンタが1に戻ってしまいます。
###該当のソースコード
Web.php
php
1Route::get('requestSlow', 'TestController@requestSlow'); 2Route::get('requestFast', 'TestController@requestFast');
TestController.php
php
1<?php 2namespace App\Http\Controllers; 3use Illuminate\Http\Request; 4use App\Http\Requests; 5 6class TestController extends Controller 7{ 8 public function requestSlow(Request $request) { 9 $this->sessiontest($request, "slow", 10); 10 } 11 12 public function requestFast(Request $request) { 13 $this->sessiontest($request, "fast", 0); 14 } 15 16 private function sessiontest(Request $request, $sesname, $delay_sec) { 17 // セッションからカウンタを取得 18 $cnt = session($sesname, null); 19 20 // カウンタの内容を表示 21 echo json_encode([$sesname => $cnt]); 22 23 // ここで処理時間を調整 24 if($cnt) sleep($delay_sec); 25 26 // カウンタを増やしてセッションに保存 27 session([$sesname => $cnt + 1]); 28 } 29}
###実際の手順
ブラウザで2つのタブを開き、下記URLを開きます。
タブ1. http://localhost/requestSlow
タブ2. http://localhost/requestFast
上記の時点で、それぞれブラウザには以下が表示されます。
タブ1. {"slow":null}
タブ2. {"fast":null}
その後、タブ1を1回リロードし、タブ1のレスポンスが返ってくるまでの10秒間の間にタブ2を10回リロードします。その結果、以下のように表示されます。
タブ1. {"slow":1}
タブ2. {"fast":10}
上記の状態で、再度タブ2のみリロードすると、以下のような表示になります。
タブ1. {"slow":1}
タブ2. {"fast":1} <-----10 が 11 にならず、1 に戻ってしまった!
###補足情報
セッション管理方法はデフォルトの「file」のままとしています。
storage/framework/sessions 配下にファイルが作成されており、中身も確認しましたが、当然ながら上記の事象と同じようにファイルの中身が戻ってしまっています。
LaravelもPHPも初めてで、セッションの取り扱いがまだ理解できておりません。どなたかお力をお貸しいただけると大変助かります!よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/07 08:01