[英]How to list a directory with a large number of files in php?
我知道有一天会发生...所以我有一个php例程来列出目录中的文件,获取属性和子目录,并返回带有漂亮json字符串和所有信息的http调用。 在我的本地主机中,我使用它来递归列出目录和子目录中的所有文件,因此我将拥有字节总数,等等。这是实际列出文件的代码的一部分:
(...)
$this->Lista = array();
$this->SubDirs = array();
$ldPont = opendir($dir);
if(!$ldPont){
$this->erro = 'perms';
return FALSE;
} else {
$this->tamanho = 0;
$this->tamanhoTotal = 0;
while(FALSE !== ($ldNome = readdir($ldPont))) {
if(substr($ldNome, 0, 1)!="." && substr($ldNome, 0, 2)!=".."){
//echo('<p>'.$ldNome.'</p>');
if(is_dir($dir.'/'.$ldNome)){
$this->SubDirs[] = $this->elementoDoArquivo($dir.'/'.$ldNome);
} else {
$path = $dir.'/'.$ldNome;
$this->tamanhoTotal += filesize($path);
$ldBase = pathinfo($path, PATHINFO_FILENAME);
$ldExt = pathinfo($path, PATHINFO_EXTENSION);
$ldExt = strtolower($ldExt);
if(is_array($Exts) && count($Exts)>0){
$ldTeste = in_array($ldExt, $Exts);
} else {
$ldTeste = TRUE;
}
if($ldTeste) {
$Arq = $this->elementoDoArquivo($path);
if($Arq["Metadados"]) $this->comMetadados = TRUE;
$this->Props[$Arq["Prop"]["name"]] = $Arq["Prop"];
$this->tamanho += $Arq["bytes"];
$this->Lista[] = $Arq;
}
}
}
}
// Saída de uma leitura ok
closedir($ldPont);
uasort($this->Lista, $sort_func[$ord]); //$sort_func[$this->ordem]);
if($ord_r) $this->Lista = array_reverse($this->Lista);
$this->Lista = array_values($this->Lista);
return $this->Lista;
}
这是一堂课。 列出目录将执行许多任务,最终它将在具有大量文件的远程服务器中超时,具体取决于服务器的可用性(它是共享主机)。 我想我需要以不同的方式处理此问题,不知道如何。 有什么建议么?
编辑:我通过使用glob的更简单的代码来解决该问题,并且不必查找每个文件的太多详细信息。 经过几次试验,我可以获得所需的结果。 但是问题仍然存在。代码是一个更大的库的一部分,这是我使用的部分:
case "list":
if(!$usrRead){
$Res->erro = "perms";
$Res->msg = "Usuário sem permissões para esse diretório.";
$Res->descr = $UsrPerms;
break;
}
$Arqs = array();
$Dirs = array();
if(!is_dir($dirTeste)){
$Res->erro = "diretório";
$Res->msg = "O diretório não existe.";
} else {
$Args = explode(",",$nome);
foreach($Args as $arg){
if($arg=="") $arg = "*.*";
$List = glob($dir.$arg);
foreach($List as $path){
if(is_file($path)) {
$Arq = array(
"nome"=>basename($path),
"datac"=>filectime($path),
"datam"=>filemtime($path),
"bytes"=>filesize($path));
if($MetaCampos){
$path_meta = nomearqMeta($path);
if($path_meta) {
$Meta = json_decode(file_get_contents($path_meta));
if($Meta) {
foreach($MetaCampos as $campo){
$Arq[$campo] = $Meta->$campo;
}
}
}
}
$Arqs[] = $Arq;
}
//if(is_dir($path)) $Dirs[] = $path;
}
}
if(count($Args)==1) {
$Dirs = glob($dir."*", GLOB_ONLYDIR);
$Dirs = array_map(function($d) { return $d."/"; }, $Dirs);
}
$Res->arqs = $Arqs;
$Res->subdirs = $Dirs;
$Res->erro = "OK";
$Res->msg = "";
}
$Res->descr = "op:list,dir:".$dir.",nome:".$nome.",metaCampos:".$metaCampos;
break;
如果您在Linux上运行,我建议通过PHP的shell_exec(或exec)执行递归目录列表,并将结果输出到文本文件中(请参见下面的代码示例)。 然后,仅使用PHP的file_get_contents()
<?php
$execListFile = shell_exec('ls -R /your/dir/path/here > mylistofFiles.txt');
$myFiles = file_get_contents('mylistofFiles.txt');
PS:此代码未经测试,但您明白了。
参考PHP.net shell_exec Linux ls命令
PS:窗口的ls -R等效于dir / s
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.