gpt4 book ai didi

php - 永无休止的ajax请求,好主意/坏主意?

转载 作者:行者123 更新时间:2023-12-01 04:44:11 30 4
gpt4 key购买 nike

对于我网站的后端,只有少数人可见,我有一个系统,通过 ajax 与 php 进行通信,如下所示:

function ajax(url, opts) {
var progress = false, all_responses = [], previousResponseLength = "";
var ajaxOptions = {
dataType: "json",
type: "POST",
url: url,
xhrFields: {
onprogress: function(e) {
if (!e.target.responseText.endsWith("\n")) return;
var response = e.target.responseText.substring(previousResponseLength).trim();
previousResponseLength = e.target.responseText.length;
var responses = response.split(/[\r\n]+/g);
var last_response;
for (var k in responses) {
if (responses[k] === "---START PROGRESS---") {
progress = true;
if (opts.onProgressInit) opts.onProgressInit();
} else if (responses[k] === "---END PROGRESS---") progress = false;
else all_responses.push(last_response = responses[k]);
}
if (progress && last_response !== undefined) opts.onProgress(JSON.parse(all_responses[all_responses.length-1]));
}
},
dataFilter: function(data){
return all_responses[all_responses.length-1];
}
}

$.extend(ajaxOptions, {
onProgress: function(data){
console.log(data);
}
});

return $.ajax(ajaxOptions);
}

还有一个永无止境的 php 脚本示例(直到用户关闭连接):

const AJAX_START_PROGRESS = "---START PROGRESS---";
const AJAX_END_PROGRESS = "---END PROGRESS---";

session_write_close(); //fixes problem of stalling entire php environment while script runs
set_time_limit(0); //allows to the script to run indefinitely
output(AJAX_START_PROGRESS);
while(true) {
output(json_encode(["asdasd" => "asasdas"]));
sleep(1);
}

function output($msg) {
echo preg_replace("`[\r\n]+`", "", $msg).PHP_EOL;
ob_flush(); flush();
}

这允许我通过 1 个 ajax 请求进行“轮询”(我是否正确使用了该术语?)因此,如果我想执行一个很长的 php 脚本,我现在可以检查其进度,最后的响应是通过 jqhxr.done(callback) 传递的。

或者,如示例 php 脚本中所示,我可以打开一个连接并将其保持打开状态。使用 sleep (1);它每 1 秒发布一次对 $.ajax 对象的更新。每个响应都必须是 json 编码的,如果响应是 1 个非常长的 json,来自多个“onprogress”调用,它会等到消息结束(如果 responseText.endsWith("\n"))我们准备好了!)

我的远程共享服务器不允许 websocket,所以我做了这个。如果用户关闭连接,php 脚本也会关闭。它只适用于少数具有特殊权限的管理员,而且我不需要担心旧浏览器。

有人能看出这个脚本有什么问题吗?通过谷歌搜索,我没有发现其他人使用这种方法,所以我认为它有问题。广泛的测试告诉我它工作得很好。

最佳答案

您发明了长轮询请求,实际上它被广泛用作websockets的后备,所以它没有任何问题。关于你的代码,未经测试很难说,但是当使用长轮询等方法时,你需要仔细检查浏览器端和服务器端的内存泄漏。

关于php - 永无休止的ajax请求,好主意/坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32498537/

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