2011-11-28 64 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";  
    } 

?> 

希望幫助您。

乾杯

相關問題