PHP加载时回显到页面

时间:2013-03-22 19:55:36

标签: php echo

我正在把一个搜索引擎放在php中,它循环遍历一些目录,然后回声过滤结果。

我的问题是,所有搜索完成后才会执行回显,导致页面在脚本完成之前保持空白。

这是正常的吗?如果是这样,我怎样才能在调用回声时显示搜索结果?

我也将最终将结果中的图像写入屏幕。可以通过同时利用客户端和服务器端来调用JS document.write函数来代替回应所有内容吗?

编辑:这是迭代的代码。我有一个标记系统,但那部分现在被注释掉了......

function checkTags($dir, $search){
  global $tag;
  $filesInDir = array_map('strtolower', scandir($dir)); // lower case the files
  $filterOut = array('.','..');
  $filesInDir = array_diff($filesInDir, $filterOut); // get rid of the current '.' and parent '..' values
             //   print_r($filesInDir);


  foreach($filesInDir as $file) {
    if($file == $tag) {  // found a tag
      echo 'found tag: '.$file.'<br>';
   /*   $tagDir = dirname($tag);
      $tagContents = strtolower(file_get_contents($file).'<br>'.$tagDir); // adding full path to include parent dirs in tag searching

      foreach($search as $s){
        if(strpos($tagContents, $s) !== false){ // the tag has a search word
          //getFiles($tagDir);
        }
      }  */
    }
    elseif(is_dir($dir.'/'.$file) !== false) { //is a folder, so try in there
      //print_r($file);
      echo 'found dir: '.htmlspecialchars($file).'<br>';
      checkTags($dir.'\\'.$file, $search);
    }
  }
}

由于

3 个答案:

答案 0 :(得分:5)

您想要将输出刷新到客户端,请使用PHP的flush()函数。

也就是说,如果你在页面加载时进行复杂的处理,那就是糟糕的用户体验。它更复杂,但如果你向用户提供某些东西,你就会提供更好的产品,即使它只是一个空的但是完整的模板,然后用AJAX异步提取昂贵的数据,如happyaccidents建议。

答案 1 :(得分:1)

绝对不是document.write,但肯定会研究JavaScript和Ajax技术来实现你的目标。

结帐http://en.m.wikipedia.org/wiki/Ajax_(programming)以获取有关Ajax的概述。

如果您是JavaScript的初学者,那么查看jQuery库可能是值得的。特别是.ajax方法。

http://jquery.com/

http://api.jquery.com/jQuery.ajax/

答案 2 :(得分:1)

我想从@ dimo414的参考文献中引用一些内容

  

多个服务器,尤其是Win32上的服务器,仍会缓冲脚本的输出,直到它终止,然后才将结果传输到浏览器。

     

像mod_gzip这样的Apache服务器模块可能会自行缓冲,这会导致flush()不会立即将数据发送到客户端。

     

即使是浏览器也可以在显示之前缓冲其输入。例如,Netscape缓冲文本,直到它收到行尾或标记的开头,并且在看到最外面的表的标记之前它不会呈现表。

     

某些版本的Microsoft Internet Explorer只会在收到256字节的输出后才开始显示页面,因此您可能需要在刷新之前发送额外的空格以使这些浏览器显示该页面。

这基本上意味着不能保证flush()实际上会将中间数据发送到客户端,或者客户端会显示它们。

如果要测试flush()是否有效,则禁用任何可能导致服务器缓冲的apache模块。即使这样,浏览器可能会等待页面已经完成加载,或者已经加载了一定数量的字节,因此测试它的最可靠方法是使用netcat。

根据我的经验,客户端在脚本结束之前会看到输出的唯一原因是因为我搞砸了并且在某个地方放置了带有回声的无限循环。在这种情况下,浏览器将冻结直到apache决定杀死脚本。正如其他人所说,AJAX是实现这一目标的方法。