使用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>
test.txt
1
2
3
4
5
6
7
8
9
10
使用:
ignore_user_abort()
ob_flush()
应该在一个php线程中完成所有您需要的工作
编辑
看一下nickb的答案,如果您正在寻找一种简单地执行此操作的方法,它将遵循以下算法:
process.php
通过ajax 打开(它将完成所有工作并打印状态报告),您必须查看jQuery ajax是否支持连续加载在process.php
:
ignore_user_abort(); // Script will finish in background
while(...){
echo "Page: $i\n";
ob_flush();
}
EDIT 2 要求的示例 (不同而难看,但简单) 。test_process.php
:
// This script will write numbers from 1 to 100 into file (whatever happens)
// And sends continuously info to user
$fp = fopen( '/tmp/output.txt', 'w') or die('Failed to open');
set_time_limit( 120);
ignore_user_abort(true);
for( $i = 0; $i < 100; $i++){
echo "<script type=\"text/javascript\">parent.document.getElementById( 'foo').innerHTML += 'Line $i<br />';</script>";
echo str_repeat( ' ', 2048);
flush();
ob_flush();
sleep(1);
fwrite( $fp, "$i\n");
}
fclose( $fp);
和主要的HTML页面:
<iframe id="loadarea"></iframe><br />
<script>
function helper() {
document.getElementById('loadarea').src = 'test_process.php';
}
function kill() {
document.getElementById('loadarea').src = '';
}
</script>
<input type="button" onclick="helper()" value="Start">
<input type="button" onclick="kill()" value="Stop">
<div id="foo"></div>
在按如下开始线后:
Line 1
Line 2
出现在div中#foo
。当我点击时Stop
,它们停止出现,但脚本在后台结束,并将所有100个数字写入文件中。
如果Start
再次点击,脚本将从乞讨(重写文件)开始执行,并行请求也会执行。
有关http流的更多信息,请参见此链接
主要内容:PHP 循环,while 循环,do...while 语句循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。 PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行。我们可以在代码中使用循环语句来完成这个任务。 在 PHP 中,提供了下列循环语句: while - 只要指定的条件成立,则循环执行代码块 do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环 for - 循环执行代码块指定的次数
问题内容: 我第一次不了解PHP。我一直在脚本中使用for循环,while循环,foreach循环。我想知道 哪一个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要使用哪个循环的代码。 很明显,我可以使用while编写上面的代码。希望有人能帮助我找出哪个循环更适合使用。 问题答案: 哪一个性能更好? 没关系 选择循环的标准是什么? 如果只需要遍历对象或数
问题内容: 我目前正在通过切换到PDO来更新我的应用。我有以下代码: 在上面的代码之后,var $ productidLst为1,2,我想使用与此等效的PDO: 我已经尝试了多种组合,但是没有成功,因此对此提供任何帮助将不胜感激(在第二个代码块$ res中是sql)。其次,我将参数$ productidLst设置为INT是否正确或应该是字符串? --------------------更新1 --
问题内容: 事情是:我有一个页面,其中必须显示未确定数量的图像,这些页面是通过AJAX(在服务器端使用base64编码)一张一张地加载的。 问题是仅当获取所有图像时,才将图像(由renderImageData()函数构造)附加到所有DIV中(一起)。我的意思是,直到循环结束,才有可能进行任何DOM操作。 由于可能会有大量的图像,因此我需要一张一张地加载和显示图像,因此我无法将它们堆叠起来,直到将它
问题内容: 我正在尝试提高SQL编程的效率。我正在尝试运行一个循环,以对仅按数字后缀更改的字段名称重复执行更新命令。 例如,而不是写出来,然后每次更新: 让我知道是否可以澄清。我正在使用SQL Server 2005。 感谢您的指导。 我正在尝试应用Adams的解决方案,并且需要了解以下N’的正确用法: 问题答案: 这实际上将不起作用,因为您不能在列名中加上引号。您实际上要做的是让SQL比较两个始
我不是新来的,但这是我第一次在这个网站上寻求帮助。 我有一个非常有趣的问题,我已经在下面的同时循环中呈现了许多动态输入字段 我的目标是使用name='adjust[]'动态输入字段更新mysql数据库中的多行。目前有200多个项目更新为表列项目库存。表已存在,列已设置为整数。 (表:项)--(列:item_inventory(接受整数)) 这是我得到的↓它目前更新循环中最后一个数组项的所有行。因为