阅读大型目录时PHP文件管理器崩溃

时间:2015-02-15 18:45:28

标签: php file-management

看起来scandir()在这里引起了问题,如果我可以设置深度限制,它可能会更好,但我不太确定。

我的网站有一个非常有条理的大型图像目录(25gb)。我使用tinyMCE与文件管理器Roxy Fileman。当我尝试加载根文件夹" images"它只是继续加载并最终崩溃。如果我硬编码打开"图像/帖子"它装得很好。我检查了源代码,看起来这个函数正在读取目录。

function listDirectory($path){
  $ret = @scandir($path);
  if($ret === false){
    $ret = array();
    $d = opendir($path);
    if($d){
      while(($f = readdir($d)) !== false){
        $ret[] = $f;
      }
      closedir($d);
    }
  }

  return $ret;
}

一个目录特别包含大约99%的图像,我不需要使用文件管理器访问它,但我也无法移动目录。 "影像/游戏"是原因。有没有办法让我忽略这个目录或者只扫描到某个深度。

1 个答案:

答案 0 :(得分:0)

如果有办法自己读取目录,可以这样做并创建一个包含忽略目录的列表。您说目录games包含大约99%的图像,但您并不需要访问它。这可能是被忽略目录的完美候选者。

如果可以,我会写如下内容:

function read_directory_files($path, array $ignored = []) {

    /*
     * Check if the provided path is readable and is a directory.
     */
    if(!is_readable($path) || is_file($path)) {
        throw new \LogicException('The provided path must be a readable directory.');
    }

    $files.      = [];
    $directories = scandir($path);

    /*
     * Remove current (.) and parent (..) directory references.
     */
    unset($directories[0], $directories[1]);

    /*
     * Check if the directory is empty after the current and parent
     * directory references has been removed.
     */
    if(empty($directories)) {
        return null;
    }

    foreach($directories as $directory) {

        if(!is_file($directory) && in_array($directory, $ignored)) {
            continue;
        }

        if(!is_file($directory)) {

            $key         = basename($directory); 
            $files[$key] = read_directory_files($directory);

        }else{

            $files[] = $directory;

        }

    }

    return $files;

}

此代码未经过测试,因此可能会出现错误,但这应该可以让您选择要从中读取文件的目录。用法是:

$ignored = [
   'games'
];

$files = read_directory_files('path/to/images', $ignored);

如果您不能使用自己的机制来读取目录,可以尝试用我编写的内容替换现有代码,但这样做会冒风险,并记得备份代码。

希望这可以有用,编码愉快!