環境・前提条件

  • 認証機能を実装している。(config : firewalls)
  • バンドル FOSUserBundle を導入している。
  • 下記の処理はログイン状態で実行される。

単純にスリープするアクションがあります。

ルーティング:demo_home_index

indexAction()
{
    sleep(60);

    return // ...
}

ファイルを読み込むアクションがあります。

ルーティング:demo_home_read

public function readAction()
{
    $file       = "/path/to/file/read.txt";
    $contents   = false;

    if (file_exists($file)) {
        $fp = fopen($file, 'r');
        $contents = fgets($fp);
        fclose($fp);
    }

    return new Response(json_encode(array(
        'contents' => $contents,
    )));
}

まずUIから非同期で indexAction にアクセスします。
と同時にインターバルでファイルを読み込む処理が走ります。

$.ajax({
    url         : Routing.generate("demo_home_index"),
    type        : "GET",
    dataType    : 'json'
})
.done(function(response){
    // スリープのため60秒は返ってこない
    console.log(response);
});

var timer = setInterval(function(){
    $.ajax({
        url         : Routing.generate("demo_home_read"),
        type        : "GET",
        dataType    : 'json'
    })
    .done(function(response){
        console.log(response);
    });
}, 3000);

この時、3秒おきにアクセスするインターバルがファイアーウォールで足止めされるというか、スリープする処理、はじめのアクセス indexAction が終了しないとインターバルでのアクセスも完了しません。

なので、インターバルで定期的にアクセスするが、60秒間全部のインターバルがローディングしている状態になり、はじめのアクセス&処理(スリープ60秒間)が完了すると、すべてのインターバルのアクセスも順次完了する状態となっています。

これは非同期に関わらず、スリープで60秒間処理している間、別タブでページにアクセスする(otherActionなど)場合でも、ローディング状態となりアクセスが中断されてしまう。

Symfony2自体のファイアーウォールの設定などを変更することで、
ファイアーウォールで中断されずに、同時処理することは可能なのでしょうか?

それともバンドルの方の問題で処理中の同時アクセスを制限しているのでしょうか?

今のところ原因のもとがわかっていない状態です。
よろしくお願いします。