我正在尝试在PHP脚本运行时显示结果,例如..一个非常长的循环,我希望它在页面加载时回显结果,我通过这个搜索了很多而且我无法'找到了一个好的答案,谷歌搜索后我发现有人说question使用ob_flush
但是它没有用,并且从php.ini启用implicit_flush
,仍然没工作
它只在进程完成时加载,我试图像这样运行for
循环
ob_start();
for($i=0; $i<500; $i++){
echo "hm\n";
ob_flush();
}
ob_end_flush();
然而,仍然无法工作......它会立即显示所有内容
我现在的最后一个猜测是它需要更多PHP配置来启用/禁用某些东西,
或..它也可能是 apache2 配置?
与此相关的配置设置是什么?需要通过Apache或PHP配置禁用/启用的设置..
PS :我确定可以单独使用PHP完成,我在GoDaddy托管上看到它,并在几个网站上看到它们,http://www.checker.freeproxy.ru/checker/index.php如果你尝试提交它会显示结果通常不使用ajax ,网站使用PHP和Apache,这背后有一个神秘的秘密
答案 0 :(得分:2)
你不能用PHP做到这一点。 PHP在服务器端运行,因此在HTTP响应发送回浏览器之前执行。
您需要使用AJAX来实现这一目标。
你也可以看看websockets来实现这种目的。
您还可以欺骗并将所有数据加载到隐藏列表中,然后使用javascript在页面加载后逐个显示列表项。 :)
答案 1 :(得分:2)
在此处查看我的帖子:Show progress bar in php while loop
它也有一些示例代码,几乎涵盖了您需要的所有内容。
PS:单靠PHP无法完成,需要使用AJAX + PHP(客户端+服务器端编码)。这是因为只有在完全解释文件后才会将响应发送到浏览器。
答案 2 :(得分:2)
我从这个answer
中使用了这种方式while(1) {
echo "should display these lines on browser while in infinite loop.<br>";
flush();
}
或使用for
循环,它们都运行良好,并且使ob_flush()
与flush()
一起使用for($i=0; $i<5000; $i++) {
echo "should display these lines on browser while in infinite loop.<br>";
usleep(30000);
ob_flush();
flush();
}
{{1}}
他们都工作正常没有 ajax
答案 3 :(得分:1)
如上所述,Ajax将是最好的方法。
你需要3个文件,一个html文件或php文件来处理这个工作,一个带有你的ajax的javascript文件和运行你脚本的php文件,这里有一个如何做到这一点的例子。剩下的由你决定,如果你需要调整你想要做的任何事情,但是如果你相应地分解你的话,它应该给出一个顺序的redout。
go.hml:
<html>
<head>
<title>Insert Title Here</title>
<script src="ajax_example.js" language="javascript"></script>
</head>
<body>
<form action="javascript:insert()" method="post">
<input type="text" name="limit" value="" id="limit"/>
<input type="submit" name="Submit" value="Go"/>
</form>
<div id="text_response"></div>
</body>
</html>
ajax_example.js:
// make script work for internet explorer too
function createObject(){
var request_type;
var browser = navigator.appName;
if(browser == 'Microsoft Internet Explorer'){
request_type = new ActiveXObject('Microsoft.XMLHTTP');
}else{
request_type = new XMLHttpRequest();
}
return request_type;
}
var http = createObject();
var response = '';
var current = 0;
var limit = 0;
function insert(){
current = 0;
// write to the document
response = 'Hang on...';
document.getElementById('text_response').innerHTML = response;
// set the limit and run the loop script
limit = encodeURI(document.getElementById('limit').value);
limit++;
loop_file(current);
}
function loop_file(i) {
// open the php file you wish to run, the 'hm' and 'rand' are optional, obviously
http.open('get', 'file.php?hm='+i+'&rand='+Math.random());
// run the insertReply function
http.onreadystatechange = insertReply;
http.send(null);
}
function insertReply(){
if(http.readyState == 4){
response = response+'<br />'+http.responseText;
document.getElementById('text_response').innerHTML = response;
current++;
// this runs like a pseudo for loop and will loop until it reaches the 'limit'
if(current < limit){
loop_file(current);
}else if(current == limit){
//create end script here
}
}
}
file.php
<?php
echo isset($_GET['hm']) ? $_GET['hm'] . " - hm\n" : "hm\n";
?>