0

いくつかのディレクトリをループし、フィルタリングされた結果をエコーする検索エンジンを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);
    }
  }
}

ありがとう

4

3 に答える 3

5

出力をクライアントにフラッシュしたい場合は、PHPのflush()関数を使用します。

とはいえ、ページの読み込み時に複雑な処理を行っている場合、それはユーザーエクスペリエンスに悪影響を及ぼします。より複雑ですが、ユーザーに何かを提供すると、たとえそれが空であるが完全なテンプレートであっても、はるかに優れた製品を提供し、happyaccidentsが示唆するように、AJAXを使用して非同期で高価なデータを取得します。

于 2013-03-22T19:57:00.347 に答える
1

間違いなくdocument.writeではありませんが、目標を達成するためにJavaScriptとAjaxのテクニックを調べてください。

Ajaxの概要については、 http: //en.m.wikipedia.org/wiki/Ajax_ ( programming)を確認してください。

JavaScriptの初心者の場合は、jQueryライブラリを確認する価値があるかもしれません。特に.ajaxメソッド。

http://jquery.com/

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

于 2013-03-22T20:01:17.627 に答える
1

@dimo414のリファレンスからいくつか引用したい

いくつかのサーバー、特にWin32では、スクリプトが終了するまでスクリプトからの出力をバッファリングしてから、結果をブラウザに送信します。

mod_gzipのようなApacheのサーバーモジュールは、独自のバッファリングを実行する場合があります。これにより、flush()によってデータがクライアントにすぐに送信されなくなります。

ブラウザでさえ、表示する前に入力をバッファリングする場合があります。たとえば、Netscapeは、行末またはタグの先頭を受け取るまでテキストをバッファリングし、最も外側のテーブルのタグが表示されるまでテーブルをレンダリングしません。

一部のバージョンのMicrosoftInternetExplorerは、256バイトの出力を受信した後にのみページの表示を開始するため、これらのブラウザーにページを表示させるには、フラッシュする前に余分な空白を送信する必要があります。

これは基本的に、flush()が実際に中間データをクライアントに送信する、またはクライアントがそれらを表示するという保証がないことを意味します。

flush()が機能するかどうかをテストする場合は、サーバーでバッファリングを引き起こしている可能性のあるapacheモジュールを無効にします。それでも、ブラウザはおそらくページの読み込みが完了するか、特定のバイト数が読み込まれるまで待機するため、netcatを使用してテストするのが最も信頼できる方法です。

私の経験では、スクリプトが終了する前にクライアントに出力が表示される唯一の理由は、私が混乱して、どこかにエコーのある無限ループを配置したためです。その場合、apacheがスクリプトを強制終了することを決定するまで、ブラウザはフリーズします。他の人が言っているように、 AJAXはこれを実現する方法です。

于 2013-03-22T21:05:15.127 に答える