2

ときどきディレクトリをスキャンし、古いキャッシュ ファイルを削除するプログラムを作成しました。

多くの場合、キャッシュ ファイルの数が非常に多くなり、メモリ不足エラーが発生しました。

glob(cacheme_directory()."*");

限られた数のファイルを返すように glob を作成するにはどうすればよいですか? 最初に 50000 とします。その後、それらを削除し、次のセッションで再度削除することができます。

これは、グロブ ディレクトリ/フォルダー リストの結果の数を制限する場合とは異なります。

メモリの使用量を減らす必要があります。したがって、すべてをロードしてから削除しても機能しません。

これは完全なプログラムです

if (mt_rand(0,1000)==0)
{

    $files = glob(cacheme_directory()."*");
    foreach($files as $file)
    {
        $filemtime=filemtime ($file);
        if (is_file($file) && time()-$filemtime>= $cacheAge)
        {
            unlink($file);
        }
    }
}
4

4 に答える 4

4

DirectoryIterator ( PHP >= 5 )で試してください:

$i = new DirectoryIterator( cacheme_directory() );
foreach ($i as $val) {
    if ($val->isFile()) {
        echo "{$val->getFilename()} ({$val->getMTime()})\n";
    }
}
于 2013-01-18T18:28:38.957 に答える
3

Glob はディレクトリ全体の配列を返しますが、それを変更することはできません。

限られた数のファイルのみをメモリに読み込むには、PHP のopendir関数を確認してください。これにより、リソースに独自のループを記述できます。

于 2013-01-18T18:24:02.110 に答える
2

グロブではできません。ただし、いくつかのワイルド カード トリックを使用できます。お気に入り

glob(cacheme_directory()."1*");

名前が数字のみで始まる場合、これは約 10 分の 1 のファイルを返します。それらがアルファベット文字のみを保持する場合a*、ファイル名の 26 分の 1 を取得するために使用できます。

ループできます。

for($i=0;$i<10;$i++){
    glob(cacheme_directory()."$i*");
}

また

for($i=ord('a');$i<=ord('z');$i++){
    glob(cacheme_directory().chr($i)."*");
}
于 2013-01-18T18:22:10.873 に答える
1

@Dutow が言ったように: glob はディレクトリ全体の配列を返しますが、それを変更することはできません。

PHP でディレクトリをループする代わりに、次のようなシェル コマンドを発行するだけです。

find /path/to/cache/dir/ -type f -delete

指定されたディレクトリ内のすべてのファイルを削除します。または、次のような特定の名前に一致させることができます。

find /path/to/cache/dir/ -type f -name 'cache*' -delete

shell()これは、またはコマンドのいずれかにアクセスできることを前提としていますが、大量のメモリを必要とせず、コマンドの最後に演算子をshell_exec()追加することでバックグラウンド化できます。&

于 2013-01-18T18:33:13.547 に答える