gpt4 book ai didi

javascript - 从 php 服务器处理数据库中的 ajax 流式传输进度

转载 作者:行者123 更新时间:2023-11-29 08:06:14 26 4
gpt4 key购买 nike

我在这个网站上看过ajax进度条解决方案,但是我找不到任何可以帮助解决以下问题的内容,

基本上,
[浏览器] ----> 对[运行 php 的服务器]进行 ajax 调用


我的 php 代码

<?php

//input and process ajax request

//[MySQL] processing 5000 rows of a table

//after 5000/5000 row, end of ajax call

?>

现在,我需要向用户显示正在处理的行的状态
例如处理:::::::::2322/5000。行

处理Mysql的代码如下所示

foreach($result_set as $table_row)
{
// process each table row
}

我如何通过 xmlhttprequest 让客户端知道此进度? 不能使用JQUERY,只能使用Javascript

尝试实现以下内容

服务器不断地循环回显进度,

<?php

//progress

while($i < $total_progress)
{
//php processing

if(@ob_get_contents()){ ob_end_flush(); flush(); }

echo $i; // progress
$i++;


}
?>

数据(变量 $i)不断被打印并推送到响应中,
有没有一种方法可以在 ajax 调用结束之前从服务器读取打印的变量?

最佳答案

这可以通过 AJAX、 session 和 JavaScript 的组合来完成。我从未制作过任何图形版本的栏,但我过去制作过基于文本的版本。

在您的客户端页面中,让 AJAX 调用您的页面来执行表处理。让此服务器端页面启动一个 session 并创建一个 session 变量来跟踪您的进度(例如 $_SESSION['processedRows'] )。现在,在处理一行后,在处理循环中增加 session 变量的值,然后调用 session_write_close() 。这会将您的 session 信息写入磁盘,然后关闭 session 。这很重要,我稍后将对此进行解释。在 session_start() 循环的下一次迭代中更新 session 变量之前,您还必须再次调用 foreach

回到客户端,您将每隔一段时间发送另一个 AJAX 请求(我在 javascript 中使用 setInterval() ),这将调用另一个服务器端页面,该页面将打开一个 session 并返回 $_SESSION['processedRows'] 的值。您可以获取此值并用它更新计数器、进度条等。您可以以 JSON 或 HTML 片段的形式返回多个值,这并不重要。只需确保您有某种回调方法,该方法将终止客户端设置的间隔。在长时间运行的脚本中调用 session_write_close() 非常重要。如果不这样做,那么用于检查进度的并发脚本将无法访问 session 变量,并且在等待处理脚本结束时会出现滞后。原因是在调用 session_write_close() 之前 session 文件尚未释放。

编辑:

这是一个非常基本的示例,说明您正在寻找什么。这与错误检查、超时等方面没有太多关系。但它应该说明您想要做什么。根据你的问题,也没有 jQuery。为此,您将需要三个文件。首先,您需要长时间运行的脚本,这个脚本基本上会让 PHP 短暂休眠 5000 次。这是为了说明你的表操作。

startCounter.php

<?php

//Start a long-running process

$goal = 5000;
session_start();
for($i = 0; $i < $goal; $i++) {
session_start(); //Reopen session to continue updating the progress
if(!isset($_SESSION['progress'])) {
$_SESSION['progress'] = $i;
$_SESSION['goal'] = $goal;
}
//wait a wink
usleep(rand(500, 2000));
$_SESSION['progress'] = $i;
session_write_close(); //Close session to gain access to progress from update script
header_remove();
}

?>

接下来你需要一个更新脚本,这个很简单,它只会输出一个带有更新进度的字符串。

updateCounter.php

<?php

//Get the progress

session_start();

print("Processed " . $_SESSION['progress'] . " of " . $_SESSION['goal'] . " rows.");

?>

接下来您需要您的客户端准备好使用 AJAX。您需要有一种方法来启动长时间运行的脚本,然后在该请求未完成时,您设置并间隔时间来访问服务器以获取当前进度。只要确保在操作完成后取消间隔即可。这是测试页面:

progress.html

<!DOCTYPE html>
<html>
<head>
<title>Progress Test</title>

<script language="javascript">

function go()
{
var xhr = new XMLHttpRequest();
xhr.open("GET", "startCounter.php", true);
interval = window.setInterval( function () {
update();
}, 200);
xhr.onreadystatechange = function () {
if(xhr.readyState == 4) {
window.clearInterval(interval);
//Extremely likely that the AJAX update function won't make it in time to catch
//the script at 5000 before it wins. So let's display a message instead showing
//that everything is done.
document.getElementById("updateme").innerHTML = "Operation has completed.";
}
}
xhr.send();
}

function update()
{
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if(xhr.readyState == 4 && xhr.status == 200) {
document.getElementById("updateme").innerHTML = xhr.responseText;
}
}
xhr.open("GET", "updateCounter.php", true);
xhr.send();
}

</script>

</head>

<body>

<form>
<input type="button" onclick="go()" value="Go!" />
</form>

<h3>AJAX update test</h3>

<h4 id="updateme"></h4>

</body>
</html>

希望这能让您朝着正确的方向前进。

关于javascript - 从 php 服务器处理数据库中的 ajax 流式传输进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22686298/

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