Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化PHP函数_Php_Optimization - Fatal编程技术网

优化PHP函数

优化PHP函数,php,optimization,Php,Optimization,我有一个函数,可以检测由字符串启动的所有文件,并返回一个填充了相应文件的数组,但速度开始变慢,因为我在特定目录中找到了20000个文件。 我需要优化这个函数,但我不知道如何优化。这就是功能: function DetectPrefix ($filePath, $prefix) { $dh = opendir($filePath); while (false !== ($filename = readdir($dh))) { $po

我有一个函数,可以检测由字符串启动的所有文件,并返回一个填充了相应文件的数组,但速度开始变慢,因为我在特定目录中找到了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;
    }

}
我还能做什么

谢谢

Wikipedia按照文件名的前几个字母来分解上传,因此
excelfile.xls
将放在类似
/uploads/e/x
的目录中,而
textfile.txt
将放在
/uploads/t/e

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

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


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

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

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

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

正如其他答案所提到的,我将研究glob()、scandir()和/或directoryinterator类,不需要重新创建控制盘


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

如何更改该目录结构?您可以根据文件名的第一个字符创建子目录,这样可以更快地找到相关文件。当你在寻找bb*glob时,不需要查看a/a/aa*可能会有一段时间的帮助,但KM是正确的:从长远来看,你必须对你的目录结构做些什么。在一个目录中有那么多文件会导致很多问题。我就是不能对目录中的大量文件做任何事情。古代软件:必须与之共存;)谢谢你的回答!这是真的,但依我看,这更多的是I/O问题,而不是内存处理问题。
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;
    }
}