gpt4 book ai didi

PHP - 使用 Ajax 刷新 While 循环数据

转载 作者:IT王子 更新时间:2023-10-28 23:58:01 25 4
gpt4 key购买 nike

使用 PHP,我想创建一个 while 循环来读取一个大文件并在请求时发送当前行号。 使用 Ajax,我想获取当前行数并将其打印到页面上。 使用 html 按钮,我希望能够单击并激活或终止仅运行一次并调用 ajax 方法 的 javascript 线程。

我试了一下,但出于某种原因,除非我注释掉 echo str_repeat(' ',1024*64); 函数,否则不会打印任何内容,当它被注释掉时,它会显示整个循环结果:

1 行已处理。2 行已处理。3 行已处理。4 行已处理。5 行已处理。6 行已处理。7 行已处理。8 行已处理。9 行已处理。10 行已处理。

在一行中而不是在单独的行中显示它们,例如:

1 row(s) processed.
2 row(s) processed.
3 row(s) processed.
4 row(s) processed.
5 row(s) processed.
6 row(s) processed.
7 row(s) processed.
8 row(s) processed.
9 row(s) processed.
10 row(s) processed.

我也不确定如何终止 JavaScript 线程。所以总共有 2 个问题:

 1. It's returning the entire While loop object at once instead of each time it loops.
2. I'm not sure how to terminate the JQuery thread.

有什么想法吗?到目前为止,下面是我的代码。

msgserv.php

<?php

//Initiate Line Count
$lineCount = 0;

// Set current filename
$file = "test.txt";

// Open the file for reading
$handle = fopen($file, "r");

//Change Execution Time to 8 Hours
ini_set('max_execution_time', 28800);

// Loop through the file until you reach the last line
while (!feof($handle)) {

// Read a line
$line = fgets($handle);

// Increment the counter
$lineCount++;

// Javascript for updating the progress bar and information
echo $lineCount . " row(s) processed.";

// This is for the buffer achieve the minimum size in order to flush data
//echo str_repeat(' ',1024*64);

// Send output to browser immediately
flush();

// Sleep one second so we can see the delay
//usleep(100);
}

// Release the file for access
fclose($handle);

?>

asd.html

<html>
<head>
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript" charset="utf-8"></script>

<style type="text/css" media="screen">
.msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
.new{ background-color:#3B9957;}
.error{ background-color:#992E36;}
</style>

</head>
<body>

<center>
<fieldset>
<legend>Count lines in a file</legend>
<input type="button" value="Start Counting" id="startCounting" />
<input type="button" value="Stop Counting!" onclick="clearInterval(not-Sure-How-To-Reference-Jquery-Thread);" />
</fieldset>
</center>

<div id="messages">
<div class="msg old"></div>
</div>

<script type="text/javascript" charset="utf-8">
function addmsg(type, msg){
/* Simple helper to add a div.
type is the name of a CSS class (old/new/error).
msg is the contents of the div */
$("#messages").append(
"<div class='msg "+ type +"'>"+ msg +"</div>"
);
}

function waitForMsg(){
/* This requests the url "msgsrv.php"
When it complete (or errors)*/
$.ajax({
type: "GET",
url: "msgsrv.php",
async: true, /* If set to non-async, browser shows page as "Loading.."*/
cache: false,
timeout:2880000, /* Timeout in ms set to 8 hours */

success: function(data){ /* called when request to barge.php completes */
addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
setTimeout(
'waitForMsg()', /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout(
'waitForMsg()', /* Try again after.. */
"15000"); /* milliseconds (15seconds) */
},
});
};

$('#startCounting').click(function() {
waitForMsg();
});
</script>

</body>
</html>

测试.txt

1
2
3
4
5
6
7
8
9
10

最佳答案

您对 PHP 和 AJAX 的交互方式感到困惑。

当您通过 AJAX 请求 PHP 页面时,您强制 PHP 脚本开始执行。尽管您可能正在使用 flush() 来清除任何内部 PHP 缓冲区,但 AJAX 调用不会终止(即,不会调用响应处理程序)直到连接关闭,这发生在已读取整个文件。

为了完成您正在寻找的东西,我相信您需要像这样的并行流程:

  1. 第一个 AJAX 帖子发送开始读取文件的请求。此脚本生成一些唯一的 ID,将其发送回浏览器,生成一个实际读取文件的线程,然后终止。
  2. 所有后续的 AJAX 请求都会转到不同的 PHP 脚本,该脚本会检查文件读取的状态。这个新的 PHP 脚本根据 #1 中生成的唯一 ID 发送文件读取的当前状态,然后退出。

您可以通过$_SESSION 变量或将数据存储到数据库中来完成此进程间通信。无论哪种方式,您都需要一个并行实现而不是当前的顺序实现,否则您将继续一次获得整个状态。

关于PHP - 使用 Ajax 刷新 While 循环数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9152373/

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