如何在jquery中向php发布另一个正在处理的ajax请求


How to post an ajax request while another is in process in jquery to php

我正在使用html、jquery、php、c++、mysql开发一个功能。

我通过php发布了一个对c++(使用协议)的ajax调用,以便在服务器机器中进行安装,这将需要一些时间来处理它并发送回响应。

在此期间,我需要通过从表中获取值来显示UI中的安装进度。

其中表值将在安装期间在后端(c++)中更新。

现在,我试图在调用主ajax请求后,使用另一个ajax调用,在UI中使用php显示同一个mysql表中的进度详细信息。

但是,一旦从第一次ajax调用中获得结果,我就会得到第二次ajax调用的响应。

现在,我如何获得介于两者之间的值?

RemoteInstallationProg();
var formPostData = "";
formPostData = "submitType=13";
formPostData = formPostData + "&";
formPostData = formPostData + "reqType=" + reqType;
formPostData = formPostData + "&";
formPostData = formPostData + "saveHost=" + document.getElementById('serhostName').value;
formPostData = formPostData + "&";
formPostData = formPostData + "saveUser=" + document.getElementById('serUserName').value;
var tarHttpdFile = doc.txtHttpdFile.value;
httpReq = GetXmlHttpRequestObject();
if(httpReq)
{
    httpReq.onreadystatechange = GetResultXML;
    httpReq.open("POST", tarHttpdFile, true);
    httpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    httpReq.send(formPostData);
}
function RemoteInstallationProg(){
var tarHttpdFile = SG_ROOT_PATH+"data/check.sgp";
var remotePost = "";
remotePost = "remoteIns=1";
remotePost = remotePost + "&";
remotePost = remotePost + "hostname=" + $('#hostName').val();
$.ajax({
    url: tarHttpdFile,
    type: "POST",
    data: remotePost,
    success:function(result)
    {
        if((result != '') && (result != 2))
        {
            ShowUserAlert(lang_alert_ary['hyperv_stat_'+result],'info');
        }
        if((result != 10) && (result != 2))
        {
            RemoteInstallationProg();
        }
    }
});}

问题:PHP默认情况下将会话数据写入文件。当请求启动会话的PHP脚本(session_start())时,该会话文件将被锁定。这意味着,如果您的网页向PHP脚本发出大量请求,例如,通过Ajax加载内容,则每个请求都可能锁定会话并阻止其他请求完成。其他请求将挂起session_start(),直到会话文件解锁。如果您的Ajax请求中有一个是相对长时间运行的,那么这种情况尤其糟糕。

解决方案:会话文件保持锁定状态,直到脚本完成或手动关闭会话。为了防止多个PHP请求(需要$_SESSION数据)被阻塞,您可以启动会话,然后关闭会话。这将解锁会话文件,并允许剩余的请求继续运行,甚至在初始请求完成之前。strong文本

您必须在第二个ajax请求之前使用session_write_close()函数。

请检查此引用session_write_close()