2017-09-29 21 views
-1

私は、膨大な量の写真(少なくとも10000ファイル)のフォルダを持っており、PHPを使用してこのファイルすべての名前を取得する必要があります。 問題は私が使用するときですscandir()私はメモリ制限についてのエラーを受けました。 はまた、私はこのようなコードを使用してみました:PHP - ディレクトリから膨大な量のファイルを読み込みます

  $files = []; 
      $dir = opendir($this->path); 
      $i = 0; 
      while(($file = readdir($dir)) !== false) { 
       $files[] = $file; 
       $i++; 
       if ($i == 100) 
        break; 
      } 

このコードは正常に動作しますが、それは私が必要なものではありません。すべてのファイルを取得しようとすると、スクリプトがクラッシュします。

さらに、私は$dirにポインタの状態を保存することを考えましたが、後でAJAX要求を使ってすべてのファイルを取得していましたが、その目的のための解決策は見つかりませんでした。

ファイルを読み込むための制限とオフセットの設定方法はありますか? ページングのような意味です。

+0

あなたの質問は何ですか? –

+1

http://php.net/manual/en/class.directoryiterator.php perhappsを見てください – Scuzzy

+0

ここで本当の質問はありませんが、10000個のファイルを実行すると、いくらかのメモリが必要になります。いずれかのキャッシュを使用し、それらの間に間隔を置いて小さなバルクのファイルを通過するか、より良いサーバーを入手してください。 – Classified

答えて

1

RecursiveDirectoryIteratorGeneratorを使用すると、メモリが大きな問題になる場合があります。

function recursiveDirectoryIterator($path) { 
    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $file) { 
    if (!$file->isDir()) { 
     yield $file->getFilename() . $file->getExtension(); 
    } 
    } 
} 

$start = microtime(true); 
$instance = recursiveDirectoryIterator('../vendor'); 
$total_files = 0; 
foreach($instance as $value) { 
    // echo $value 
    $total_files++; 
} 
echo "Mem peak usage: " . (memory_get_peak_usage(true)/1024/1024)." MiB"; 
echo "Total number of files: " . $total_files; 
echo "Completed in: ", microtime(true) - $start, " seconds"; 

ここで私はそれほど素晴らしいノートパソコンを持っています。

enter image description here

+0

これは私が必要とするものです!どうもありがとうございました! –

0

は、私はあなたができるので、(あなたがLinuxやUnix上のPHPを実行していると仮定)、Unixのバックグラウンドを持っている:

  • システムコールへ:/ binに/ lsの-C1>ずつfiles.list
  • read files.listと表示することができます
  • あなたはファイルを読むためにfile_get_contents()を使うことができます。
関連する問題