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 拡張機能を作成できます。これにより、外部ユーティリティへの呼び出しがバイパスされ、大幅に高速化されるはずです。拡張機能を作成するプロセスは、ここなどの多くの場所で詳しく説明されています。このような拡張への合理的なアプローチは、現在 /usr/include/bits/stat.h で定義されている stat 構造体で利用可能な高精度フィールドを公開する代替の fstat 関数実装である可能性があります。

いつものように、何も無料ではありません。この拡張機能は維持する必要があり、ホストされた環境などで実行することはおそらく不可能です。さらに、php ソリューションは、拡張機能がデプロイされたサーバーでのみ実行されます (ただし、ls ベースの手法に頼ることで回避できます)。拡張子が検出されない場合)。

于 2012-06-29T23:42:57.060 に答える