サーバーまたはplからcronjobコマンドを使用せずに、x時間後(たとえば24時間後)にサブディレクトリ内のすべてのファイルを自動削除するにはどうすればよいですか。PHPコードを使用するか、何かをクリックせずにページにアクセスしてコマンドを自動実行するだけで、これを行うにはどうすればよいですか。
8 に答える
私の最初の答えからの最後のコメントに対する応答。コードサンプルを作成するので、コメントをもう1つ追加するのではなく、別の回答を作成しました。
カスタム拡張子のファイルを削除するには、コードを実装する必要があります。
<?php
$path = dirname(__FILE__).'/files';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24
if (preg_match('/\.txt$/i', $file)) {
unlink($path.'/'.$file);
}
}
}
}
?>
コメント:1。この例では正規表現/\.txt$/i
を使用しています。これは、拡張子txt
が付いたファイルのみが削除されることを意味します。「$」記号は、ファイル名が文字列「.txt」で終了する必要があることを意味します。フラグ「i」は、比較で大文字と小文字が区別されないことを示します。preg_match()関数の詳細。
さらに、strripos()関数を使用して、特定の拡張子を持つファイルを検索できます。コードスニペットは次のとおりです。
<?php
$path = dirname(__FILE__).'/files';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24
if (strripos($file, '.txt') !== false) {
unlink($path.'/'.$file);
}
}
}
}
?>
コメント:この例はもっと明白なようです。の結果はstrripos()
、2つの関数を組み合わせることでも実現できます。strrpos(strtolower($file), '.txt')
ただし、私見では、コードで使用する関数を少なくして、読みやすく小さくすることをお勧めします。strripos()関数(戻り値ブロック)のページにある警告を注意深くお読みください。
もう1つの重要な注意事項:UNIXシステムを使用している場合、ファイルのアクセス許可が原因でファイルの削除が失敗する可能性があります。chmod()関数のマニュアルを確認できます。
幸運を。
PHPのコア関数filectime()およびunlink()を使用して、ファイルの作成時刻を確認し、そのファイルを削除できます。
編集。 コード例:
if ($handle = opendir('/path/to/files')) {
while (false !== ($file = readdir($handle))) {
if (filectime($file)< (time()-86400)) { // 86400 = 60*60*24
unlink($file);
}
}
}
さて、X日経過したファイルを削除するPHPスクリプトです。
<?
$days = 1;
$dir = dirname ( __FILE__ );
$nofiles = 0;
if ($handle = opendir($dir)) {
while (( $file = readdir($handle)) !== false ) {
if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
continue;
}
if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) {
$nofiles++;
unlink($dir.'/'.$file);
}
}
closedir($handle);
echo "Total files deleted: $nofiles \n";
}
?>
次に、このコードを貼り付けてphpファイルとして保存し、ファイルを削除するフォルダーにアップロードします。このphpコードの冒頭で見ることができます
$days = 1;
これは日数を設定します。たとえば、2に設定すると、2日より古いファイルは削除されます。基本的に、これは、スクリプトを実行し、現在のディレクトリを取得してファイルエントリを読み取り、「。」をスキップしたときに発生することです。現在のディレクトリについて、さらに他のディレクトリがあるかどうかを確認します。
if ( $file == '.' || $file == '..' || is_dir($dir.'/'.$file) ) {
continue;
}
ファイルエントリがディレクトリでない場合は、ファイルの変更時刻(最終変更時刻)を取得し、それが日数である場合は比較します
if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) {
$nofiles++;
unlink($dir.'/'.$file);
}
条件がtrueになると、unlink()php関数を使用してファイルが削除されます。最後にディレクトリを閉じて終了します。また、削除されたファイルの数をカウントするカウンターを追加しました。これは、削除プロセスの最後に表示されます。したがって、phpファイルをファイルの削除が必要なディレクトリに配置して実行します。
うまくいけば、それが役立つでしょう:)
私はシェルATコマンドを使用しますが、それはcronジョブのようなものです。
php:
exec("echo rm /somedir/somefile.ext|at now +24 hours");
これはGLOBを使用する別の例で、すべてのファイルを削除します
$files = glob('path/to/your/files/*');
foreach($files as $file) { // iterate files
// if file creation time is more than 5 minutes
if ((time() - filectime($file)) > 3600) { // 86400 = 60*60*24
unlink($file);
}
}
または特定のファイルを除外したい場合
$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT);
これらの例を使用しようとした後、私はいくつかの問題にぶつかりました。
- 比較演算子は、より大きく、より小さくする必要があります
- filemtimeは変更された時間を返します。filectimeは、ファイルのiノードデータが変更された時刻です。つまり、iノードからのアクセス許可、所有者、グループ、またはその他のメタデータが更新された場合、予期しない結果が生じる可能性があります
filemtimeを使用するように例を変更し、次のように比較を修正しました。
<?php
$path = dirname(__FILE__).'/files';
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ((time()-filemtime($path.'/'.$file)) > 86400) { // 86400 = 60*60*24
if (preg_match('/\.txt$/i', $file)) {
unlink($path.'/'.$file);
}
}
}
}
?>
function deleteCachedData($hours=24)
{
$files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt');
foreach($files as $file) {
if(is_file($file) && (time() - filectime($file)) > $hours*3600) {
unlink($file);
}
}
}
$path = 'folder/subfolder/';
/* foreach (glob($path.'.txt') as $file) { */
foreach (glob($path.'*') as $file) {
if(time() - filectime($file) > 86400){
unlink($file);
}
}