6

我试图在 PHP 脚本运行时显示结果,例如.. 一个非常长的循环,我希望它在页面加载时回显结果,我通过这个搜索了很多,但我找不到很好的答案,谷歌搜索后我发现有人说ob_flush这个问题的使用..但它没有工作,以及启用implicit_flushfrom php.ini ,仍然没有工作
它只在进程完成时加载,我试图运行像这样的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

4 回答 4

4

我从这个答案中使用了这种方式

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();
}

他们都可以在没有ajax的情况下正常工作

于 2013-01-17T12:13:56.733 回答
2

你不能用 PHP 做到这一点。PHP 在服务器端运行,因此它在 HTTP 响应发送回浏览器之前执行。

您需要使用 AJAX 来实现这一点。

你也可以看看 websockets 来实现这种事情。

您也可以作弊并将所有数据加载到隐藏列表中,然后在页面加载后使用javascript将列表项一一显示。:)

于 2013-01-17T11:41:04.260 回答
2

在这里查看我的帖子:在 php while 循环中显示进度条

它也有一些示例代码,几乎涵盖了您需要的所有内容。

PS:单独用PHP是做不到的,需要用AJAX+PHP(客户端+服务器端编码)来做。这是因为只有在文件被完全解释后才会将响应发送到浏览器。

于 2013-01-17T11:45:22.013 回答
2

如上所述,Ajax 将是最好的方法。

你需要 3 个文件,一个 html 文件或 php 文件,一个包含你的 ajax 的 javascript 文件和运行你的脚本的 php 文件,这里是你如何做到这一点的一个例子。如果你需要它来调整你想要做的任何事情,其余的取决于你,但如果你相应地分解你的 php,它应该给出一个顺序的 redout。

去.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
    }
  }
}

文件.php

<?php
echo isset($_GET['hm']) ? $_GET['hm'] . " - hm\n" : "hm\n";
?>
于 2013-01-17T12:42:51.630 回答