Nur neugierig
$files = glob(cacheme_directory()."*");
foreach($files as $file)
{
$filemtime=filemtime ($file);
if (time()-$filemtime>= 172800)
{
unlink($file);
}
}
Ich möchte nur sicherstellen, ob der Code korrekt ist oder nicht. Vielen Dank.
Sie sollten einen is_file()
check hinzufügen, da PHP normalerweise .
UND ..
sowie Unterverzeichnisse aufführt, die sich in dem Verzeichnis befinden, das Sie überprüfen.
Wie diese Antwort schlägt vor , sollten Sie die vorberechneten Sekunden durch eine ausdrucksstärkere Notation ersetzen.
<?php
$files = glob(cacheme_directory()."*");
$now = time();
foreach ($files as $file) {
if (is_file($file)) {
if ($now - filemtime($file) >= 60 * 60 * 24 * 2) { // 2 days
unlink($file);
}
}
}
?>
Alternativ können Sie auch die DirectoryIterator
, verwenden, wie in dieser Antwort gezeigt . In diesem einfachen Fall bietet es keine Vorteile, aber es wäre OOP.
Der einfachste Weg ist die Verwendung von DirectoryIterator :
<?php
if (file_exists($folderName)) {
foreach (new DirectoryIterator($folderName) as $fileInfo) {
if ($fileInfo->isDot()) {
continue;
}
if ($fileInfo->isFile() && time() - $fileInfo->getCTime() >= 2*24*60*60) {
unlink($fileInfo->getRealPath());
}
}
}
?>
Eine andere, einfachere und modernere Methode, mit FilesystemIterator .
Ich verwende 'logs' als Beispiel.
$fileSystemIterator = new FilesystemIterator('logs');
$now = time();
foreach ($fileSystemIterator as $file) {
if ($now - $file->getCTime() >= 60 * 60 * 24 * 2) // 2 days
unlink('logs/'.$file->getFilename());
}
Der Hauptvorteil ist: DirectoryIterator gibt virtuelle Verzeichnisse zurück "." und ".." in einer Schleife . Aber FilesystemIterator ignoriert sie.
Sieht für mich richtig aus. Ich würde nur vorschlagen, dass Sie 172800
durch 2*24*60*60
zur Verdeutlichung ersetzen.
Beachten Sie, dass Sie auf Probleme stoßen, wenn sich sehr viele Dateien im Verzeichnis befinden.
Wenn Sie der Meinung sind, dass sich dies wahrscheinlich auf Sie auswirkt, sollten Sie einen Ansatz auf niedrigerer Ebene wie opendir
verwenden.
Hier ist ein Beispiel, wie es rekursiv geht.
function remove_files_from_dir_older_than_x_seconds($dir,$seconds = 3600) {
$files = glob(rtrim($dir, '/')."/*");
$now = time();
foreach ($files as $file) {
if (is_file($file)) {
if ($now - filemtime($file) >= $seconds) {
echo "removed $file<br>".PHP_EOL;
unlink($file);
}
} else {
remove_files_from_dir_older_than_x_seconds($file,$seconds);
}
}
}
remove_files_from_dir_older_than_x_seconds(dirname(__file__).'/cache/', (60 * 60 * 24 * 1) ); // 1 day
/* Delete Cache Files Here */
$dir = "cache/"; /** define the directory **/
/*** cycle through all files in the directory ***/
foreach (glob($dir."*") as $file) {
//foreach (glob($dir.'*.*') as $file){
/*** if file is 24 hours (86400 seconds) old then delete it ***/
if (filemtime($file) < time() - 172800) { // 2 days
unlink($file);
}
}
Ich hoffe es hilft dir.
/** It deletes old files.
* @param string $dir Directory
* @param int $secs Files older than $secs seconds
* @param string $pattern Files matching $pattern
*/
function delete_oldfiles($dir,$secs,$pattern = "/*")
{
$now = time();
foreach(glob("$dir$pattern") as $f) {
if (is_file($f) && ($now - filemtime($f) > $secs)) unlink($f);
}
}