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