質問: 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自体のファイアーウォールの設定などを変更することで、 ファイアーウォールで中断されずに、同時処理することは可能なのでしょうか? それともバンドルの方の問題で処理中の同時アクセスを制限しているのでしょうか? 今のところ原因のもとがわかっていない状態です。 よろしくお願いします。
回答: 目を付けられているように、セッションでのファイルロックが原因のようですね。 `session_write_close()`のページを見ると、PHPデフォルトのファイルベースセッション管理を使っている場合、何もしなければスクリプト終了時までセッションファイルがロックされます。このため、次のリクエストでは、セッションファイルの書き込みオープンのためのロック解放を待つことになります。 これを回避するには、コントローラでセッションに関連する更新処理が完了したら、その時点で`session_write_close()`を呼び出すようにします。 Symfonyの場合、`session_write_close()`に相当するのは、コントローラでは次のコードになります。 ``` $this->get('session')->save(); ``` ですので、質問の検証コードならば、`indexAction()`で`sleep()`する前に上記コードを入れて試して頂く感じです。 また、別の対処法として、ファイルベースのセッション管理ではなく、PDO等を使うように変更することでセッションのブロッキングをなくすこともできます。How to Use PdoSessionHandler to Store Sessions in the Databaseに解説があります。