2011-03-02 27 views
7

すべてのサブフォルダをフォルダにリストする関数を作成する必要があります。私はファイルなしフィルタを持っていますが、この関数はリストにscandir()を使います。そのため、アプリケーションは非常に遅くなります。 scandir()の代わりに、ネイティブPHP関数でなくてもいいですか? ありがとうございます!PHP:scandir()が遅すぎる

+3

あなたがスキャンしているディレクトリにいくつのファイル/ディレクトリがありますか?それが起こったときに各ディレクトリで 'stat()'を実行していないか、そこに何千ものファイルがあります。 –

+0

http://www.php.net/manual/en/function.scandir.php#96326 – Detect

+0

http://www.php.net/manual/en/function.scandir.php#73062 – Detect

答えて

2

あなたはこのような何か、速いかもしれのreaddirを使用することができます。

function readDirectory($Directory,$Recursive = true) 
{ 
    if(is_dir($Directory) === false) 
    { 
     return false; 
    } 

    try 
    { 
     $Resource = opendir($Directory); 
     $Found = array(); 

     while(false !== ($Item = readdir($Resource))) 
     { 
      if($Item == "." || $Item == "..") 
      { 
       continue; 
      } 

      if($Recursive === true && is_dir($Item)) 
      { 
       $Found[] = readDirectory($Directory . $Item); 
      }else 
      { 
       $Found[] = $Directory . $Item; 
      } 
     } 
    }catch(Exception $e) 
    { 
     return false; 
    } 

    return $Found; 
} 

は、いくつかのtweekingが必要になる場合がありますが、これはSCANDIRが何をするか、本質的であり、私としてアップデートを書いてくださいされていない場合、それは、より速くする必要があります私はより速い解決策を作ることができるかどうかを見たいと思っています。

もう1つの問題は、非常に大きなディレクトリを読んで内部メモリ内の配列を埋めることであり、メモリがどこにあるのかもしれません。

一度に50ファイルを返すことができるように、オフセットを読み込む関数を作成してみてください!一度にファイルのチャンクを読み込む

は、使用するだけのように簡単になりますので、同様に次のようになります。

$offset = 0; 
while(false !== ($Batch = ReadFilesByOffset("/tmp",$offset))) 
{ 
    //Use $batch here which contains 50 or less files! 

    //Increment the offset: 
    $offset += 50; 
} 
+0

すべては完璧だと思われますが、これを無効にする方法。および..フォルダ。私も空のインデックスを持っていますが、それはリストしたくありません。私はそれがキャッチ(例外)にあると思いますが、それをどのようにフォーマットするのですか? –

+0

Iveが '.'または' ..'を含んでいないように更新されましたが、空のインデックスに関して何を意味するのかわかりません – RobertPitt

+0

YES !!!!それは私のために完璧に動作します。君たちありがとう! –

2

が独自に書いてはいけません。親指のルール(時間の別名ではない100%)、それがまっすぐCで実装されますから、何でもあなたがPHPで構築するよう

http://php.net/manual/en/class.recursivedirectoryiterator.php

に起こっている:PHPは、再帰的なディレクトリイテレータはこのために特別に構築されています遅くなる。

+1

リアルタイムソフトウェアを作成していない限り、PHPの「遅さ」はまったく問題になりません。 – dynamic

+0

ディレクトリ反復子を 'ParentIterator'(または別名のイテレータフィルタ)にラップし、ファイルなしにします。 – salathe

関連する問題