2009-07-08 18 views
0

私は、文字列で始まるすべてのファイルを検出し、対応するファイルでいっぱいの配列を返しますが、特定のディレクトリに20000個のファイルがあるため遅くなり始めています。 私はこの機能を最適化する必要がありますが、私はどのように見えません。これは関数です:PHPの最適化機能

function DetectPrefix ($filePath, $prefix) 
{ 

    $dh = opendir($filePath); 
    while (false !== ($filename = readdir($dh)))   
    { 
     $posIni = strpos($filename, $prefix); 
     if ($posIni===0):       
      $files[] = $filename;      
     endif; 
    } 

    if (count($files)>0){        
     return $files; 
    } else { 
     return null; 
    } 

} 

これ以上何ができますか?

おかげ

+0

どのようにそのディレクトリ構造を変更しますか?ファイル名の最初の文字に基づいてサブディレクトリを作成すると、関連するファイルをさらに早く見つけることができます。 bb * – sisve

+2

グロブを探しているときに/ a/aa *を調べる必要はありませんが、KMは間違いありません。長期的には、ディレクトリ構造について何かする必要があります。 1つのディレクトリに多数のファイルがあると、多くの問題が発生する可能性があります。 – stefs

+0

私はそのディレクトリにある膨大な数のファイルについて何もできません。古代のソフトウェア:それと一緒に生きなければならない;)すべての答えをありがとう! – RSilva

答えて

11

http://php.net/glob

$files = glob('/file/path/prefix*'); 

ウィキペディアは、ファイル名の最初のカップルの文字でアップロードを壊すので、textfile.txt/uploads/t/eに行くだろうがexcelfile.xls/uploads/e/xのようなディレクトリに行くだろう。

glob(または他の方法)のファイル数を減らすだけでなく、ディレクトリ内の最大ファイルを避けることもできます。

4

scandir()を使用して、readdir()を使用してディレクトリ内のファイルを1つずつ反復するのではなく、リストすることができます。 scandir()は、ファイルの配列を返します。

しかし、ファイルシステムの構成を変更することができればよいでしょう.2つ以上のファイルを1つのディレクトリに保存する必要がありますか?

1

確かにわかりませんが、おそらくDirectoryIteratorは少し速いです。また、ファイルが追加または削除されたときにのみリストが生成されるようにキャッシングを追加します。

0

文字の最初のの長さを比較するだけです。だから、このてみてください:他の回答が言及したよう

function DetectPrefix($filePath, $prefix) { 
    $dh = opendir($filePath); 
    $len = strlen($prefix); 
    $files = array(); 
    while (false !== ($filename = readdir($dh))) { 
     if (substr($filename, 0, $len) === $prefix) { 
      $files[] = $filename; 
     } 
    } 
    if (count($files)) { 
     return $files; 
    } else { 
     return null; 
    } 
} 
+0

それは本当ですが、IMHO、これはI/Oの問題で、メモリ内の処理の問題です。 –

2

を、私は(グロブで見てね)、SCANDIR()、および/またはのDirectoryIteratorクラス、ホイールを再作成する必要はありません。

注意してください!オペレーティングシステムを確認してください。ただし、1つのディレクトリにあるファイルの最大数には制限があります。この場合、同じディレクトリにファイルを追加し続けるだけで、ダウンタイムが発生し、制限に達するといくつかの問題が発生します。このエラーは、アクセス許可または書き込みエラーとして表示され、「1つのディレクトリに複数のファイルを書き込むことはできません」という明白なメッセージではありません。

関連する問題