2017-09-29 4 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; 
      } 

이 코드는 잘 작동하지만, 내가 원하는 게 아니에요 : 또한,이 같은 코드를 사용했습니다. 모든 파일을 가져 오려고하면 스크립트가 여전히 충돌합니다.

게다가 나는 나중에 AJAX 요청을 통해 그것을 사용하고 모든 파일을 얻는 것에 대해 $dir에 포인터의 상태를 저장하는 것에 대해 생각했지만 그 목적을위한 해결책을 찾을 수 없습니다.

파일 읽기에 대한 제한 및 오프셋의 설정 방법이 있습니까? 페이지 매김과 같은 의미입니다.

+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"; 

다음은 내가 쓴 멋진 노트북입니다.

+0

이것은 내가 필요한 것입니다! 고마워요! –

0

나는 당신이 할 수 있도록 (리눅스 유닉스에서는 PHP를 실행하는 가정), 유닉스 배경이 :

  • 시스템 호출 :/빈/LS -c1>의 files.list
  • 당신은 시스템 콜을 정렬, 파싱, 편집하고 싶은만큼 복잡하게 만들 수 있습니다 ...
  • filesystems를 읽고 파일을 읽으려면 file_get_contents()를 사용할 수 있습니다.
관련 문제