gpt4 book ai didi

javascript - 对单个文件的多个 HTTP 请求

转载 作者:行者123 更新时间:2023-11-30 21:10:27 24 4
gpt4 key购买 nike

目前,我正在尝试调用名为“sniffer.php”的单个 PHP 文件。我正在使用 javascript 对 PHP 文件执行此异步操作。我目前遇到的问题是,在 PHP 代码中,我随机添加了一个 sleep 函数(就像正在加载页面一样)。问题是有两个或多个函数调用该页面,它仍然会等到其中一个页面先完成,然后停止启动另一个请求。 EG:一个睡5秒,一个睡6秒。第一个在 5 秒内完成,下一个在 11 秒内完成。我正在寻找的是一个在 5 秒内完成,下一个在一秒后完成。我不确定是否只是“ sleep ”导致了问题,或者文件是否因为 sleep 而被“锁定”。

感谢任何帮助/反馈。

我的 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();

最佳答案

这是由于 session 而发生的。如果脚本需要时间,它会在有或没有 sleep 的情况下发生。

开始 session 时会发生什么? PHP 必须确保 session 数据是最新的并且不会更改,它还必须确保它更改的数据在下一次执行中可用。

因此,如果一个脚本试图在 session 在其他地方打开时打开 session ,则会出现锁定,因为第一个脚本很可能仍然会更改 session 信息。一旦第一个脚本关闭 session ,下一个脚本就可以获取它并继续。

您可以调用session_write_close()关闭 session 进行写入,从而解除锁定。当 session 关闭时,它的值仍然可以访问,但它将是任何后续脚本更改任何内容之前的值(如果您的第二个脚本在第一个脚本结束之前更改了某些内容,则不会知道)。另外,如果你向 session 写入新数据,它不会被保存...

来自 documentation

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time.

而且看起来你不是唯一一个:

You can have interesting fun debugging anything with sleep() in it if you have a session still active. For example, a page that makes an ajax request, where the ajax request polls a server-side event (and may not return immediately).

If the ajax function doesn't do session_write_close(), then your outer page will appear to hang, and opening other pages in new tabs will also stall.

关于javascript - 对单个文件的多个 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46200904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com