如何同时运行ajax调用 - php

时间:2017-03-24 06:08:20

标签: javascript php jquery ajax

这可能是一个愚蠢的问题,但我不能轻易弄清楚为什么它会像这样行为

我有两个ajax调用函数,

execCommand():用于通过php执行shell命令

  

shell_exec(' ping 127.0.0.1> ../ var / log / tmp.log');

getLog():用于收集execCommand()[../var/log/tmp.log]的日志并显示给用户[live read]

  

echo file_get_contents(../ var / log / tmp.log);

这是jquery ajax脚本

    $("#docker_install_fek").on("click",function(){

        $('#progress-window').show();
        getLog();
        execCommand();
    });

    function execCommand(){

        $.ajax({
            url: '<?php echo $block->getUrl('meta/reports/ajax',[]);?>',
            type: 'POST',
            data:{ip:$("#ip").val()},
            success: function(data) {
                alert(data);
            },
            error: function() {
                alert("fail");
            }
        });

    }
    function getLog() {

        $.ajax({
            type: "GET",
            url: "<?php echo $block->getUrl('meta/reports/progress',[]);?>",
            dataType: "text",
            success: function (data) {
                $("#progress-window").empty();
                $("#progress-window").append("<pre>"+data+"</pre>");
                $("#progress-window").scrollTop(1E10);
                setTimeout(getLog, 3000);
            },
            headers: {
                "Range" : "bytes=-500"
            }
        });
    }

我注意到在firebug net选项卡中,两个ajax调用都在加载,但它从不渲染日志,直到execCommand()完成执行。

我不知道主要原因是什么,我测试就像从终端运行ping 127.0.0.1 > ../var/log/tmp.log然后每3秒注释execCommand()现在getLog()函数更新日志文件。

1 个答案:

答案 0 :(得分:0)

您正在使用会话。在服务器端,会话被锁定,因此您一次只能通过一个脚本打开会话文件。

如果你的服务器端脚本应该是非阻塞的,那么要么不要在其中使用session_start(),要么一定要尽快用session_write_close()关闭会话,以允许其他要运行的脚本。