目前,我正在尝试调用名为' sniffer.php'的单个PHP文件。 我正在使用javascript对PHP文件进行异步。我目前遇到的问题是,在PHP代码中,我随机添加了一个睡眠函数(就像加载页面一样)。问题是两个或多个函数调用该页面它仍然等待,直到其中一个页面完成,然后停止启动另一个请求。 EG:一个人睡5秒钟,另一个人睡6秒钟。第一个在5秒内完成,下一个在11秒完成。我要找的是一个在5秒内结束,下一个结束后的一秒钟。我不确定它是否只是“睡觉”。导致问题或文件被锁定'因为睡觉
感谢您提供任何帮助/反馈。
我的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();
答案 0 :(得分:1)
这是因为会话而发生的。如果脚本需要时间,它会在有或没有睡眠的情况下发生。
开始会话时会发生什么? PHP必须确保会话数据是最新的并且它不会改变,它还必须确保它所更改的数据在下次执行时可用。
因此,如果一个脚本在其他地方打开时尝试打开会话,那么就会锁定,因为第一个脚本可能会很好地更改会话信息。第一个脚本关闭会话后,下一个脚本可以暂停并继续。
您可以调用session_write_close()
关闭会话以进行写入,从而删除锁定。当会话关闭时,仍然可以访问它的值,但它将是任何后续脚本更改任何内容之前的值(如果第二个脚本在第一个脚本结束之前发生了某些变化,则无法知道)。此外,如果您将新数据写入会话,则不会保存...
会话数据通常在脚本终止后存储 需要调用session_write_close(),但会话数据被锁定 为了防止并发写入,只有一个脚本可以在会话上运行 在任何时候。
似乎你不是唯一一个:
如果有的话,你可以通过sleep()调试任何有趣的乐趣 你的会话仍然有效。例如,一个页面 ajax请求,其中ajax请求轮询服务器端事件(和 可能不会立即返回。)
如果ajax函数没有执行session_write_close(),那么你的外 页面将显示为挂起,并在新选项卡中打开其他页面 也失速了。