2013-03-22 58 views
0

我正在放在一起搜索引擎在PHP中循环了一些目录和回声滤波结果,因为它去了。回声页面,而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); 
    } 
    } 
} 

感谢

+0

那么你还没有显示你的代码,这样就可以给出关于如何修改代码以在搜索过程中回显结果的建议。 – 2013-03-22 20:01:31

+0

@MikeBrant代码添加。 – John 2013-03-22 20:11:42

回答

5

要刷新输出到客户端,使用PHP的flush()功能。

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

+0

这是正确的答案,以实现OP用PHP问的问题,但可能不建议,因为它不会是一个非常不错的用户体验 – philipobenito 2013-03-22 20:18:05

+0

对不起刚刚注意到您的编辑 – philipobenito 2013-03-22 20:18:36

+0

@ dimo414我试图把回声呼叫后,但已没有运气。我将不得不研究AJAX,仍然在寻找一个如何实现的例子。 – John 2013-03-22 20:26:35

1

我想从@ dimo414的参考引用一些事情

几台服务器,特别是在Win32中,仍然会从你的脚本缓冲输出,直到它结束然后将结果传输到浏览器。为Apache

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

即使浏览器可能会在显示它之前缓冲其输入。例如Netscape浏览器,文本缓冲器,直到它接收到一个端部的行或标签的开始,并且直到最外层表的标签被认为是它不会呈现表。

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

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

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

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