我正在尝试创建基于文件的CMS博客。
要显示我需要的帖子,请在文件夹中获取10个最新文件。
我找到了scandir,但我不知道它要读取所有文件,然后对它们进行排序,因为它需要时间来处理对文件数量的依赖。
所以我发现opendir,这样我可以逐个浏览文件夹文件,但是,正如opendir的文档所说,它使用的文件系统的顺序在linux中基于时间戳,但首先来了修改了最新文件。
所以我要问的是有一种方法可以改变linux如何命令文件夹中的文件。 或者有办法做我想做的事吗?
答案 0 :(得分:1)
查看:http://php.net/manual/en/function.filemtime.php,在用户评论中有一个示例来获取最新文件,您可以修改该文件以根据其mtime返回10个最新文件。
答案 1 :(得分:0)
如果你有一个包含大量文件的文件夹,并担心scandir的性能,
你可以考虑设置一个cronjob来做后台scandir +排序,
确保将结果存储到另一个存储中,如memcache / database / disk-file
我们说你的cronjob每5分钟就会跑一次,
你的cronjob脚本应该覆盖存储上的结果
只有在成功时(在scandir +排序结束后)
因此,您的CMS脚本只是从存储中读取,
或者如果没有找到存储结果,
然后继续scandir +排序
通常第一个用户点击页面并且缓存没有准备好,他会得到一个非常慢的响应,
这是使用cronjob的原因是进行预缓存
答案 2 :(得分: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";
}
?>
希望对你有所帮助。
欢呼声