10

我知道我的文件系统以毫秒为单位存储文件修改时间,但我不知道通过 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

我假设点后面的数字是毫秒。

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

$filelist = `ls -t`;

但是,该目录有时会包含大量文件,我注意到ls在这种情况下可能会非常慢。

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

$filelist = `find $dir -type f -printf "%T@ %p\n" | sort -n | awk '{print $2}'`;

而且,当然,这不会以毫秒为单位进行排序,因此在同一秒内创建的文件有时会以错误的顺序列出。

4

1 回答 1

6

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

现在,如果这个特性对你来说真的很重要,你可以编写一个专门的 PHP 扩展。这将绕过对外部实用程序的调用,并且应该更快。创建扩展的过程在很多地方都有很好的解释,比如这里。这种扩展的合理方法可能是另一种 fstat 函数实现,它公开了现在 /usr/include/bits/stat.h 中定义的 stat 结构中可用的高精度字段。

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

于 2012-06-29T23:42:57.060 回答