我正在使用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()