PHP在运行时显示结果

时间:2013-01-17 11:39:47

标签: php linux apache debian flush

我正在尝试在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,这背后有一个神秘的秘密

4 个答案:

答案 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";
?>