Почему запросы jQuery AJAX к контроллерам Symfony обрабатываются параллельно, а не асинхронно? - PullRequest
0 голосов
/ 27 августа 2018

При публикации простых данных в простом сценарии 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?

1 Ответ

0 голосов
/ 27 августа 2018

Как только вы начнете сеанс в php, php заблокирует его, и последующим запросам придется ждать, пока сеанс снова станет доступным.

Таким образом, если ваш сценарий Symfony использует сеансы, вы можете одновременно выполнять только 1 запрос, используя этот сеанс, пока сеанс открыт.

Отключение сеансов (если это даже вариант ...) или закрытие его, когда он вам больше не нужен, разрешит параллельные запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...