PHP清单目录文件按第一个最新


php listing a directory files by first the newest

我正在尝试创建一个基于文件的CMS博客。

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

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

所以我找到了opendir,这样我就可以一个文件一个文件地浏览文件夹,但是,正如opendir的文档告诉我的那样,它使用文件系统的顺序,在linux中是基于时间戳的,但首先是最新修改的文件。

所以我问是否有一种方法可以改变linux如何在文件夹中排序文件。还是有办法做我想做的事?

看一下:http://php.net/manual/en/function.filemtime.php,在用户评论中有一个获取最新文件的示例,您可以将其修改为根据mtime返回10个最新文件。

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

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

所以,你的CMS脚本只是从存储中读取
或者如果没有找到存储结果,
然后继续执行scandir +排序

通常第一个用户点击页面,缓存还没有准备好,他会得到一个非常慢的响应,
这就是使用cronjob进行预缓存

的原因

我想我可以帮助你,但我的代码将列出所有文件,而不是只有最后20个,很容易添加,这段代码将列出最新的到最旧的:

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

希望这对你有帮助。

欢呼