这可能是一个愚蠢的问题,但我不能轻易弄清楚为什么它会像这样行为
我有两个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()函数更新日志文件。
答案 0 :(得分:0)
您正在使用会话。在服务器端,会话被锁定,因此您一次只能通过一个脚本打开会话文件。
如果你的服务器端脚本应该是非阻塞的,那么要么不要在其中使用session_start(),要么一定要尽快用session_write_close()关闭会话,以允许其他要运行的脚本。