我正在尝试创建一个基于文件的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";
}
?>
希望这对你有帮助。
欢呼