2011-11-28 101 views
0

以下是我尝试创建基于文件的CMS博客的内容。php通过第一个最新列出目录文件

并显示我需要的帖子获取文件夹中的10个最新文件。

我找到了scandir,但我没有什么必须读取所有的文件,然后对它们进行排序,因为处理依赖于文件数量的时间。

所以我发现opendir,这种方式我可以通过文件的文件夹文件,但是,作为opendir的文档告诉,它使用的文件系统,至少在Linux是基于时间戳的顺序,但首先是最新的文件改性。

所以我问的是有一种方法来改变linux如何命令文件夹中的文件。 还是有办法做我想要的?

+0

该文档说opendir按日期顺序输出?我很确定它是以任意顺序(也许升序inode顺序)。 –

+0

@therefromhere [here](http://php.net/manual/en/function.opendir.php)第一条评论 – Tomas

+2

我相信你必须阅读所有的文件(使用scandir),因为你基本上是对一个无序列表进行排序最好是O(n * log(n))...并且linux似乎不允许你改变文件的顺序。出于好奇,为什么你的文章文件而不是MySql条目? – Tomas

回答

0

如果你有大量的文件的文件夹,并担心SCANDIR的性能,
你可以考虑设置一个cronjob做背景SCANDIR +排序,
确保你把结果存储到另一个存储像内存缓存/数据库/磁盘文件

让我们说你的cronjob运行每5分钟
您的cronjob脚本应该覆盖在存储结果
只有在成功(即SCANDIR +排序结束后)

所以,你的CMS脚本只是从存储读取,
或者如果没有发现从存储结果,
然后用SCANDIR +分拣

通常第一个用户击中页面和缓存不是继续准备好了,他会得到一个非常缓慢的响应,
这是使用一个cronjob的原因是做预缓存

0

我想我可以帮你,但我的代码将列出所有文件,而不是仅在过去的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";  
    } 

?> 

希望帮助您。

干杯

相关问题