Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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_Linux_File_List_Filesystems - Fatal编程技术网

php列出了一个目录文件的第一个最新版本

php列出了一个目录文件的第一个最新版本,php,linux,file,list,filesystems,Php,Linux,File,List,Filesystems,下面是我试图创建一个基于文件的CMS博客的东西 为了显示帖子,我需要在一个文件夹中获取10个最新文件 我找到了,但我不知道必须读取所有文件,然后对它们进行排序,因为处理所需的时间取决于文件的数量 因此,我发现,通过这种方式,我可以逐个文件浏览文件夹,但正如opendir的文档所述,它使用文件系统的顺序,linux中的文件系统是基于时间戳的,但首先是修改的最新文件 所以我要问的是,有没有一种方法可以改变linux对文件夹中文件的排序方式。 或者有什么方法可以满足我的要求吗?如果您有一个包含大量文件

下面是我试图创建一个基于文件的CMS博客的东西

为了显示帖子,我需要在一个文件夹中获取10个最新文件

我找到了,但我不知道必须读取所有文件,然后对它们进行排序,因为处理所需的时间取决于文件的数量

因此,我发现,通过这种方式,我可以逐个文件浏览文件夹,但正如opendir的文档所述,它使用文件系统的顺序,linux中的文件系统是基于时间戳的,但首先是修改的最新文件

所以我要问的是,有没有一种方法可以改变linux对文件夹中文件的排序方式。
或者有什么方法可以满足我的要求吗?

如果您有一个包含大量文件的文件夹,并且担心scandir的性能,
您可以考虑设置一个CRONPORT来进行后台SCADIRR+排序,
确保将结果存储到另一个存储器中,如memcache/database/disk file

假设您的cronjob每5分钟运行一次,
cronjob脚本应覆盖存储上的结果
仅在成功后(在scandir+排序结束后)

因此,您的CMS脚本只是从存储器中读取,
或者,如果未找到存储结果,
然后继续进行scandir+排序

通常第一个用户点击页面时,缓存还没有准备好,他会得到非常慢的响应,

这就是使用cronjob的原因,它是为了进行预缓存。请看:,在用户评论中,它有一个获取最新文件的示例,例如,您可以修改它,根据其mtime返回10个最新文件。

我想我可以帮到您,但我的代码将列出所有文件,而不仅仅是最后20个文件,易于添加,tis代码将从最新到最旧列出:

<?PHP

$directory="photos";
$sortOrder="newestFirst";

   $results = array();
   $handler = opendir($directory);

while ($file = readdir($handler)) { 
       if ($file != '.' && $file != '..' && $file != "robots.txt" && $file != ".htaccess"){
           $currentModified = filectime($directory."/".$file);
           $file_names[] = $file;
           $file_dates[] = $currentModified;
       }   
   }
       closedir($handler);

   //Sort the date array by preferred order
   if ($sortOrder == "newestFirst"){
       arsort($file_dates);
   }else{
       asort($file_dates);
   }

   //Match file_names array to file_dates array
   $file_names_Array = array_keys($file_dates);
   foreach ($file_names_Array as $idx => $name) $name=$file_names[$name];
   $file_dates = array_merge($file_dates);

   $i = 0;

   //Loop through dates array and then echo the list
   foreach ($file_dates as $$file_dates){
       $date = $file_dates;
       $j = $file_names_Array[$i];
       $file = $file_names[$j];
       $i++;

       echo  "<img src=photos/$file>\n";       
   }

?> 

希望这对你有帮助


干杯

文档中说opendir按日期顺序输出在哪里?我很确定它是按任意顺序排列的(可能是按顺序升序)。@从这里开始,我认为你必须阅读所有文件(使用scandir),因为你本质上是在对一个无序列表进行排序,最多是O(n*log(n))。。。linux似乎不允许您更改文件的顺序。出于好奇,为什么你的帖子是文件而不是MySql条目?@Tomas根据经验我很肯定这是错误的(或者至少是文件系统相关的)。你可能一开始就把它们整理好了…@因此,你可能是对的,我在文件管理和php方面没有太多经验;我只是想分享我的0.02美元。