2013-03-22 36 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是這一個去的方式。