多个HTTP请求到单个文件
目前,我试图调用一个名为'sniffer.php'的PHP文件。 我正在做这个异步使用javascript到一个PHP文件。我目前遇到的问题是,在PHP代码中,我随机添加了一个睡眠函数(以加载页面的方式运行)。这个问题是两个或更多的函数调用该页面,它仍然等待,直到其中一个页面完成,然后停止启动另一个请求。 EG:一人睡5秒,另一人睡6秒。第一个在5秒内完成,下一个在11秒完成。我正在寻找的是5秒内完成的,而下一个完成后的一秒钟。我不确定是否只是“睡眠”引起问题,或者因为睡眠而导致文件被“锁定”。多个HTTP请求到单个文件
感谢您的任何帮助/反馈。
我的PHP文件看起来是这样的:
$c = rand(2,10);
sleep($c);
$html .= $c;
echo json_encode(array('html'=>$html,'status'=>1));
exit;
我的JavaScript类如下所示:
var path = '/';
var polling = {
add : function(name, obj) {
this[name] = new xAjax(obj);
return this;
}
};
function xAjax(options) {
var consti = {
};
var defaults = {
url: path + 'sniffer.php',
method: 'POST',
responseType: 'json',
async: true,
timeout: 30000,
success: function(response) {console.log(response);},
done: function() {},
beforeSend: function() {},
error: function(e) {console.log(e);},
abort: function() {}
};
var settings = Object.assign({}, defaults, options, consti);
var xhr = null;
this.run = function() {
xhr = new XMLHttpRequest();
settings.beforeSend();
xhr.responseType = settings.responseType;
xhr.open(settings.method, settings.url, settings.async);
xhr.timeout = settings.timeout;
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
if (xhr.status === 200) {
settings.success(xhr.response);
} else {
settings.error(xhr.response);
}
settings.done();
xhr = null;
}
};
xhr.send();
return this;
};
this.abort = function() {
xhr.abort();
xhr = null;
settings.abort();
return this;
};
this.isRunning = function() {
return xhr != null;
};
this.set = function(options) {
settings = Object.assign({}, defaults, options, consti);
return this;
};
}
我的创作/打电话到sniffer.php:
polling.add('x');
polling.x.run();
polling.add('y');
polling.y.run();
这正因为会议而发生。如果脚本需要时间,它会在有或没有睡眠的情况下发生。
当您开始会话时会发生什么? PHP必须确保会话数据是最新的,并且不会改变,它还必须确保它所更改的数据在下次执行时可用。
因此,如果一个脚本试图在其他地方打开会话的时候,会有一个锁,因为第一个脚本可能会很好地改变会话信息。一旦第一个脚本关闭了会话,下一个脚本就可以保留它并继续。
您可以拨打session_write_close()
关闭会话进行写入,从而删除锁定。当会话关闭时,它的值仍然可以被访问,但是它会是任何后续脚本改变任何内容之前的值(如果你的第二个脚本在第一个脚本结束之前改变了某些内容,它将不会被知道)。另外,如果你写新的数据会话,它不会被保存...
后脚本终止而不 需要调用session_write_close(会话数据通常存储)但由于会话数据被锁定为 以防止并发写入,因此只有一个脚本可以随时在会话 上运行。
而且好像你是不是唯一的一个:
你可以开心有趣调试它与睡眠)什么(如果 你有一个会话仍然有效。例如,一个页面发出ajax请求,其中ajax请求轮询服务器端事件(并且 可能不会立即返回)。
如果ajax函数没有执行session_write_close(),那么您的外部 页面将挂起,并且在新选项卡中打开其他页面 也会停止。
这解释了很多,谢谢。 – Deadweight
PHP会话锁定并发请求。检查你是否在你的PHP代码中启动任何会话,这将解释它。 – jorgonor
不幸的是,睡眠会延迟当前会话的执行,而不仅仅是当前的请求。 – ADyson
你说得对。我正在开始一个会议。我假设没有办法绕过这一点。如果它是睡眠以外的东西(EG SQL进程),它仍然会话锁定? – Deadweight