3

PHPで特定の日付の後に新しいファイルのリストを取得する、またはおそらくシステムコールを使用する最も効率的な方法は何ですか?

私はファイルを受け取ったときにファイルを保存する方法を完全に制御できるので、年/月/日/ファイル名などのフォルダー構造にファイルを保存するのが最善だと思いました。または、scandirを使用して取得したい日付と同じで、ディレクトリ名をint値にキャストします。しかし、これをより簡単に/より速くする何かが欠けているかどうかはわかりません。時間の経過とともに多くのファイルが蓄積され、古いディレクトリを再スキャンする必要がないため、これを行う最も効率的な方法に興味があります。基本的に、ディレクトリ構造は効率的な手動フィルタリングに適しているはずですが、何かが足りないかどうかを確認したかったのです。

簡単な使用例:

'2012/12/1' contains files test1.txt, test2.txt
'2012/12/2' => test3.txt, test4.txt
'2011/11/1' => test5.txt
'2011/11/2' => test6.txt

2011/11/2以降にファイルを検索する場合、test5.txt以外のすべてを返すようにします。

洞察を事前に感謝します!

編集:ファイルの保存と実際の処理は2つの別個のプロセスであるため、ファイルが入ってくるときにそれらを処理することはできません。これが明らかに最善の解決策です。

4

2 に答える 2

1

一般的に言えばYYYY/MM/DD、ファイルを保存するようなディレクトリを作成します。多くの場合、ソースごとに別のレベルがあります。などを使うこともありますYYYY-MM/DD。10 年間は 3652 日しかないため、1 つのレベルのようなものを使用することもでき、YYYY-MM-DD大きすぎて作業しにくいディレクトリを取得することはできません。ディレクトリにインデックスを付けるファイルシステムがある場合、ディレクトリ内に数万のファイルを簡単に作成できます。それ以外の場合は、おそらく 1,000 が上限になるはずです。

ファイルを処理するために、ディレクトリ名を実際に検索する必要はありません。関心のある日付がわかっているので、単純にパスを生成し、適切な日付範囲のファイルを含むディレクトリのみをスキャンできます。

たとえば、過去 1 週間のすべてのファイルを処理したいとします。

for $date = today() - 7 to today():
    $path = strftime("%Y/%m/%d", $date)
    for $filename in getFiles($path):
        processFile($path, $filename)
于 2012-12-24T05:06:30.893 に答える
0

パスの書き方に基づいて、Linux または Mac を使用しているようです。

find コマンドは、特定の日付内に変更 (またはアクセス) されたファイルのリストを返すことができます。

// find files that were modified less than 30m ago
$filelist = system("find /path/to/files -type f -mmin -30"); 

システム コールは移植性を低下させるため、控えめに使用する必要があると思います。

あなたが言及したようにディレクトリに保存することは、検索スペースを減らすので理にかなっています。

于 2012-12-24T02:24:57.843 に答える