【问题标题】:Optimize PHP function优化PHP功能
【发布时间】:2009-07-08 23:36:24
【问题描述】:

我有一个函数可以检测所有以字符串开头的文件,它会返回一个填充了对应文件的数组,但它开始变慢了,因为我在特定目录中有 20000 个文件。 我需要优化这个功能,但我就是不知道怎么做。这是函数:

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;
    }

}

我还能做什么?

谢谢

【问题讨论】:

  • 改变那个目录结构怎么样?您可以根据文件名的第一个字符创建子目录,这样可以更快地找到相关文件。查找 bb* 时无需查看 a/a/aa*
  • glob 可能会有所帮助,但 KM 是正确的:从长远来看,您必须对目录结构做一些事情。在一个目录中有这么多文件会导致很多问题。
  • 我对那个目录中的大量文件无能为力。古老的软件:必须忍受它;)谢谢您的所有回答!

标签: php optimization


【解决方案1】:

http://php.net/glob

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

维基百科按文件名的前几个字母对上传文件进行拆分,因此excelfile.xls 将进入类似/uploads/e/x 的目录,而textfile.txt 将进入/uploads/t/e

这不仅减少了glob(或任何其他方法)必须排序的文件数量,而且避免了其他人提到的目录中的最大文件问题。

【讨论】:

    【解决方案2】:

    您可以使用scandir() 列出目录中的文件,而不是使用readdir() 逐个遍历它们。 scandir() 返回一个文件数组。

    但是,如果您可以更改文件系统组织会更好 - 您真的需要在单个目录中存储 20000 多个文件吗?

    【讨论】:

      【解决方案3】:

      正如其他答案所提到的,我会查看 glob()、scandir() 和/或 DirectoryIterator 类,不需要重新创建轮子。

      不过要小心!检查您的操作系统,但单个目录中的最大文件数可能有限制。如果是这种情况,并且您只是在同一目录中不断添加文件,您将遇到一些停机时间,并且会出现一些问题,当你达到极限时。此错误可能会显示为权限或写入失败,而不是明显的“您无法在单个目录中写入更多文件”消息。

      【讨论】:

        【解决方案4】:

        我不确定,但DirectoryIterator 可能快一点。还添加缓存,以便仅在添加或删除文件时生成列表。

        【讨论】:

          【解决方案5】:

          您只需要比较前缀的第一个长度字符。所以试试这个:

          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;
              }
          }
          

          【讨论】:

          • 没错,但恕我直言,这更多是 I/O 问题,而不是内存处理问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-02
          • 2018-12-25
          相关资源
          最近更新 更多