При публикации простых данных в простом сценарии PHP
с использованием jQuery
$.ajax({...})
несколько запросов обрабатываются параллельно.При выполнении с контроллером Symfony 2.8
в качестве цели запрос обрабатывается синхронно. Почему это так?
Обычные настройки HTML и PHP
// Plain PHP file: /testscript.php
<?php
sleep($_POST['time']);
echo $_POST['id'];
// Plain HTML file: /testpage.html
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
Click here:
<div id='testbtn' style="background-color: #abc">Click</div>
<script>
$(document).ready(function() {
var start = new Date().getTime();
var count = 1;
$("#testbtn").click(function() {
var time = new Date().getTime();
console.log('Click at '+count+':' + (time - start));
$.ajax({
url : '/testscript.php',
type : "post",
data : {'time':3, 'id':count},
async: true,
context : this,
success : function(data) {
var end = new Date().getTime();
console.log('Click Success: ' + data + " - " + (end - start));
}
});
count++;
});
$.ajax({
url : '/testscript.php',
type : "post",
data : {'time':10, 'id':0},
async: true,
context : this,
success : function(data) {
var end = new Date().getTime();
console.log('Auto Success: ' + data + " - " + (end - start));
}
});
console.log('Ajax fired');
});
</script>
</body>
</html>
Настройка Symfony
// Controller Action to handle /sym_testscript.php
public function testScriptAction(Request $request) {
sleep($request->get('time'));
return new Response($request->get('id'), Response::HTTP_OK);
}
// Controller Action to handle /sym_testpage.php
public function testPageAction() {
return $this->render('MyBundle::sym_testpage.html.twig');
}
// Twig-Template for /sym_testpage.html
...exactly the same HTML code as above. Twig is only used to insert URL
...
$.ajax({
url : '{{ path('sym_testscript') }}',
...
Страница /testpage.html
вызывает /testscript.php
при загрузке со значением ожидания 10 секунд.При нажатии кнопки несколько раз водопад загрузки страницы выглядит примерно так:
1: ======================================== // initial call of testscript.php
2: ============ // testscript.php called by 1 click
3: ============ // testscript.php called by 2 click
4: ============ // testscript.php called by 3 click
Каждый щелчок по кнопке немедленно вызывает testscript.php
, который затем выполняется параллельноначальный вызов и другие вызовы кнопок.Таким образом, каждый клик-вызов длится 3 секунды.
При использовании вместо этого версии Symfony водопад выглядит следующим образом:
1: ======================================== // initial call of testscript.php
2: ====================================================
3: ================================================================
4: ============================================================================
Опять же, каждое нажатие кнопки немедленно вызывает /sym_testscript.php
.Но теперь звонки обрабатываются один за другим.Таким образом, общее время выполнения составляет не 10 секунд, а 19 = 10 + 3 + 3 + 3 ...
При использовании sym_testscript.php
в простом HTML-файле в качестве цели результат будет тем же.Таким образом, проблема, похоже, в контроллере Symfony
...
Почему это так?Почему ajax-вызовы не обрабатываются параллельно при использовании решения Symfony
?