问题描述
使用PHP 的,我想作一个while循环读取大型文件,并将当前行号时提出要求。 使用Ajax 的,我想获得当前的行数,并把它打印出来到一个页面。 使用HTML按钮的,我希望能够点击激活或终止该只运行一次,并调用的 AJAX方法的
一个JavaScript线程我已经给了它一个镜头,但由于某些原因,没有打印除非我注释掉回声str_repeat('',1024 * 64);
函数时,它的评论出来,它显示了整个循环的结果:
1行(S)processed.2行(S)processed.3行(S)processed.4行(S)processed.5行(S)processed.6行(S)processed.7行(S) processed.8行(S)processed.9行(S)processed.10行(S)处理。
在一个单一的线,而不是向他们展示在不同的线路,如:
1行(S)处理。
2行(S)处理。
3行(S)处理。
4列(S)处理。
5行(S)处理。
6行(S)处理。
7排(S)处理。
8行(S)处理。
9行(S)处理。
10排(S)处理。
另外,我不知道如何结束的JavaScript线程。因此,在总共2个问题:
1,它返回整个While循环的对象,而不是在每次循环时的一次。
2.我不知道如何终止JQuery的线程。
任何想法?下面是我的code为止。
msgserv.php
< PHP
//初始化行计数
$ lineCount = 0;
//设置当前文件名
$文件=test.txt的;
//打开文件进行读取
$处理= FOPEN($文件,R);
//更改执行时间为8小时
ini_set('的max_execution_time,28800);
//循环遍历文件,直到你到达最后一行
而(!的feof($处理)){
//读取一行
$行=与fgets($处理);
//增加计数器
$ lineCount ++;
// JavaScript的更新进度条和信息
回声$ lineCount。 行(S)进行处理。
//这是用于缓冲器实现的最小尺寸以冲洗数据
//回声str_repeat('',1024 * 64);
//立即将输出发送到浏览器
冲洗();
//睡了一秒钟,这样我们就可以看到延迟
// usleep(100);
}
//释放访问的文件
fclose函数($处理);
?>
asd.html
< HTML>
< HEAD>
<脚本SRC =HTTP://$c$c.jquery.com/jquery-latest.min.js类型=文/ JavaScript的字符集=utf-8>< / SCRIPT>
<风格类型=文本/ CSS媒体=屏幕>
。味精{背景:#aaa;填充:.2em;下边框:1px的#000固体}
。新{背景色:#3B9957;}
.error {背景色:#992E36;}
< /风格>
< /头>
<身体GT;
<中心>
<字段集>
<传奇>计数在一个文件&LT行; /传说>
<输入类型=按钮值=开始计数ID =startCounting/>
<输入类型=按钮值=别数了!的onclick =clearInterval(未当然,如何对引用jQuery的多线程); />
< /字段集>
< /中心>
< DIV ID =消息>
< DIV CLASS =味精老>< / DIV>
< / DIV>
<脚本类型=文/ JavaScript的字符集=utf-8>
功能ADDMSG(类型,味精){
/ *简单的辅助添加一个div。
类型是一个CSS类(旧/新/错误)的名称。
味精是DIV *的内容/
$(#信息)。追加(
< DIV CLASS =味精+类型+'>+味精+< / DIV>中
);
}
传播waitForMsg(){
/ *这个请求的URLmsgsrv.php
当它完成(或错误)* /
$阿贾克斯({
键入:GET,
网址:msgsrv.php
异步:真,/ *如果设置为非异步,浏览器显示页面中..* /
缓存:假的,
超时:2880000,/ *超时设置为8个小时毫秒* /
成功:功能(数据){/ *调用时请求barge.php完成* /
ADDMSG(新,数据); / *添加响应于。味精格(具有新类)* /
的setTimeout(
waitForMsg()',/ *请求下一条消息* /
1000 / * ..after1秒* /
);
},
错误:函数(XMLHtt prequest,textStatus,errorThrown){
ADDMSG(错误,textStatus +(+ errorThrown +));
的setTimeout(
waitForMsg()',/ *尝试后再次.. * /
15000); / *毫秒(15秒)* /
},
});
};
$('#startCounting)。点击(函数(){
waitForMsg();
});
< / SCRIPT>
< /身体GT;
< / HTML>
的test.txt
1
2
3
4
五
6
7
8
9
10
使用:
- jQuery杀死Ajax请求
-
ignore_user_abort()
-
使用ob_flush()
应该做的一切,你需要在一个PHP线程
修改
看看nickb的回答,如果你正在寻找一种方式如何做到这一点简单地将它下面的算法:
- 的javascript打开
process.php
通过AJAX(这将完成所有的工作和打印状态报告),你要看看了jQuery的AJAX是否支持连续加载李> - 如果用户决定停止刷新,你会杀了加载的演出中提供的链接
在 process.php
:
ignore_user_abort(); //脚本会在后台完成
而(...){
回声页面:$ I \ N的;
使用ob_flush();
}
编辑2 请比如(不同的和丑陋的,但简单的位)的。 test_process.php
:
//这个脚本会写数字从1到100到文件(无论发生什么事)
//并将持续信息用户
$计划生育=的fopen('/tmp/output.txt','W')或死亡(无法打开);
或者set_time_limit(120);
ignore_user_abort(真正的);
为($ i = 0; $ I< 100; $ I ++){
回声<脚本类型= \文/ JavaScript的\> parent.document.getElementById('富')的innerHTML + ='行$ I< BR />';< / SCRIPT>中;
回声str_repeat('',2048);
冲洗();
使用ob_flush();
睡眠(1);
FWRITE($计划生育,$我的\ n);
}
fclose函数($ FP);
和主HTML页面:
< IFRAME ID =loadarea>< / IFRAME>< BR />
<脚本>
功能帮手(){
。的document.getElementById('loadarea')SRC ='test_process.php';
}
功能杀死(){
的document.getElementById('loadarea')SRC =''。
}
< / SCRIPT>
<输入类型=按钮的onclick =帮手()值=开始>
<输入类型=按钮的onclick =杀了()值=停止>
< DIV ID =富>< / DIV>
在开始击球线路为:
1号线
2号线
出现在DIV #foo
。当我打停止
,他们不再出现,但脚本完成了背景和写作全部100个数字到文件中。
如果你击中启动
再次脚本开始从乞讨(重写文件),因此将平行的要求做的。
有关HTTP流看此链接
Using PHP, I would like to make a while loop that reads a large file and sends the current line number when requested. Using Ajax, I'd like to get the current line count and print it out onto a page. Using html buttons, I'd like to be able to click and activate or terminate a javascript thread that runs only ONCE and calls the ajax method.
I have given it a shot but for some reason, nothing prints unless I comment out the echo str_repeat(' ',1024*64);
function and when it's commented out, it shows the entire loop result:
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.
In a single line instead of showing them in separate lines like:
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.
Also I'm not sure how to terminate the JavaScript thread. So 2 problems in total:
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.
Any ideas? Below is my code so far.
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
Using:
should do all you need in one php thread
EDIT
Take a look at nickb's answer, if you're looking for a way how to do this simply it would be following algorithm:
- javascript opens
process.php
via ajax (which will do all the work AND print status reports), you have to look up whether jQuery ajax supports continuous loading - if user decides to stop refreshes you'll kill loading as show in provided link
In process.php
:
ignore_user_abort(); // Script will finish in background
while(...){
echo "Page: $i\n";
ob_flush();
}
EDIT 2 requested example (bit of different and ugly, but simple). 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);
And main html page:
<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>
After hitting start lines as:
Line 1
Line 2
Appeared in the div #foo
. When I hit Stop
, they stopped appearing but script finished in background and written all 100 numbers into file.
If you hit Start
again script starts to execute from the begging (rewrite file) so would parallel request do.
For more info on http streaming see this link
这篇关于PHP - 法拉盛While循环数据与阿贾克斯的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!