2014-11-07 2 views
0

특정 디렉토리의 모든 이미지 파일 목록을 반환하는 데 재귀 함수를 사용하고 있습니다. 이 함수는 반환 된 배열의 특정 크기가 될 때까지 제대로 작동합니다 (문제라고 가정). 이 문제를 해결하기 위해 내가 할 수있는 다른 조치가 있습니까? 아니면 응용 프로그램이 실행되는 동안 코드가 많이 변경되지 않아도 구현할 수있는 대안이 있습니까? 여기에 나의 재귀 함수가있다.PHP에서 배열 크기가 제한됩니다 scandir()

function scanDirectories($rootDir, $allowext, $allData=array()) { 
     $dirContent = scandir($rootDir); 
      foreach($dirContent as $key => $content) { 
       $path = $rootDir.'/'.$content; 
       $ext = substr($content, strrpos($content, '.') + 1); 

       if(in_array($ext, $allowext)) { 
        if(is_file($path) && is_readable($path)) { 
         $allData[] = $path; 
        }elseif(is_dir($path) && is_readable($path)) { 
         // recursive callback to open new directory 
         $allData = scanDirectories($path, $allData); 
        } 
       } 
      } 
      return $allData; 
     } 

예를 들어 나는 83 개의 이미지 파일이있는 디렉토리가 있지만 그 중 28 개만 목록을 반환 할 수 있습니다. 인터넷에서 검색 할 때 ini_set('memory_limit', '1024M');을 사용하여 1GB까지 메모리 제한이 있지만 내 문제를 해결할 수 없기 때문에 의 결과가 될 수 있음을 발견했습니다.

+0

오류 PHP는 무엇을 반환합니까? – gvgvgvijayan

+0

'try catch'블록에 넣을 때 오류가 발생하지 않습니다. – Cyberpks

답변

0

... (현재 및 상위 디렉토리)을 디렉토리 목록으로 반환합니다. 스크립트가 무한 반복적으로 실행되도록 할 수 있습니다.

가 문제를 해결할 수

}elseif(is_dir($path) && is_readable($path) && $content!='.' && $content!='..') { 

와 라인

}elseif(is_dir($path) && is_readable($path)) { 

을 교체하십시오.

+0

반환 된 배열에는 목록에 필요한 파일 만 있고 상위 또는 현재 디렉토리는 없으므로 그렇게 말한 것처럼 생각하지 않습니다. 그러나 그것이 무엇을 반환했는지는 실제로 반환해야하는 것보다 훨씬 적습니다. – Cyberpks

+0

그러면 파일을 허가하는 것이고, 파일을 걸러내는'allowext'가 있어야합니다. 1GB (또는 심지어 16MB) 메모리가 83 파일을 검색하는 데 충분하지 않다고 생각합니다./ – Hereblur

+0

예 1GB가 너무 길기는하지만 그 문제는 해결되지 않았습니다. 이제 권한과 관련하여 모든 사진에 대해 '읽기'로 설정되므로 문제가되지 않아야합니다. – Cyberpks