获取大型文件列表,按文件时间排序,单位为*毫秒*

Jer*_*emy 10 php linux php-5.2

我知道我的文件系统存储文件修改时间(以毫秒为单位),但我不知道通过PHP访问该信息的方法.当我这样做时,ls --full-time我看到了这个:

-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.047666435 -0700 file1
-rw-r--r-- 1 nobody nobody 900 2012-06-29 14:08:37.163667038 -0700 file2
Run Code Online (Sandbox Code Playgroud)

我假设点后的数字是毫秒.

所以我意识到我可以使用ls并按修改时间排序,如下所示:

$filelist = `ls -t`;
Run Code Online (Sandbox Code Playgroud)

但是,目录有时会有大量的文件,我注意到ls在这种情况下可能会很慢.

所以相反,我一直在使用,find但它没有用于按修改时间对结果进行排序的开关.这是我现在正在做的一个例子:

$filelist = `find $dir -type f -printf "%T@ %p\n" | sort -n | awk '{print $2}'`;
Run Code Online (Sandbox Code Playgroud)

当然,这并没有降低到毫秒级,因此在同一秒内创建的文件有时会以错误的顺序列出.

fvu*_*fvu 6

只有少数文件系统(如EXT4)实际存储这些时间达到纳秒精度.这不是保证可用的东西,在其他文件系统(如EXT3)上你会注意到小数部分是.000000000

现在,如果此功能对您非常重要,您可以编写专门的PHP扩展.这将绕过对外部实用程序的调用,并且应该更快.许多地方都很好地解释了创建扩展的过程,就像这里一样.这种扩展的合理方法可以是替代的fstat函数实现,它公开了现在在/usr/include/bits/stat.h中定义的stat结构中可用的高精度字段.

像往常一样,没有什么是免费的 必须维护此扩展,可能无法在托管环境等上运行它.此外,您的php解决方案将仅在部署了扩展的服务器上运行(尽管可以通过回退基于ls的技术来避免如果未检测到扩展名).