Was ist der richtige Weg, um gespeicherte temporäre Dateien in PHP zu bereinigen?
Ich versuche einen Weg zu finden, um meinen temporären Speicherplatz mit PHP zu bereinigen. Ich weiß, dass ich Cron-Jobs einrichten kann, aber gibt es eine Möglichkeit, dies von PHP selbst aus zu tun?
Ich verwende einen temporären Speicherordner zum Speichern generierter PDF-Dateien, die der Benutzer herunterladen kann. Ich habe es geschafft, einen Ablauf für die Datei zu erzwingen, sodass sie nach 3 Minuten nicht mehr öffentlich verfügbar ist. Nun das Problem. Obwohl auf die Datei nicht öffentlich zugegriffen werden kann, wird sie dennoch auf meinem Server gespeichert. Ich habe so etwas codiert, um den Speicher aufzuräumen.
/** from the main thread */
if (rand(1, 100) <= 5) {
Reports::clean();
}
/** the clean function */
public static function clean()
{
$path = static::getStoragePath(); if($dir_handle = opendir($path)) { while (($fileName = readdir($dir_handle)) !== false) { $file = $path . '/' . $fileName;
if (!is_file($file)) continue; // If file is older that 3 minutes delete it if (time() - filemtime($file) > static::$expires) { unlink($file);
}
}
closedir($dir_handle);
}
}
Dadurch wird der Speicher nach dem Zufallsprinzip aufgeräumt. Meistens ist das in Ordnung. Aber das Problem ist, wenn die Speicherbereinigung diese Verlangsamung dieser Anforderung wie Schildkröte startet.
Also dachte ich daran, einen Cronjob zu kreieren. Aber gibt es einen richtigen Weg, dies von PHP selbst zu tun?
Hinweis: Ich verwende Slim-4 und habe auch nicht viel Erfahrung mit dem Einrichten von Cronjobs. Daher ist auch jede Ressource hilfreich
Antworten
Kurze Antwort: nein.
PHP hat keine Möglichkeit, Aktionen selbst auszulösen.
Erstellen Sie ein Skript (oder einen Befehl, wenn es sich um ein Framework handelt) und lösen Sie es mit einem Cronjob aus.
Wenn in Ihrer Implementierung die Bereinigungsroutine abhängig vom Dateivolumen in Ihrem PDF-Verzeichnis auf den Hauptthread trifft, kann dies zu einer erheblichen Verzögerung der Antwort führen.
Wie in den anderen Kommentaren / Antworten erwähnt, wäre ein Cron-Job in der Tat die "Standard" -Methode, um damit umzugehen. Wenn Sie jedoch keinen Zugriff auf Cron-Jobs haben oder einfach eine reine PHP-Lösung bevorzugen, gibt es neben dem, was Sie bereits tun, einige mögliche Ansätze.
Führen Sie ein Protokoll der erstellten Dateien zusammen mit einem Erstellungszeitstempel. Wenn die Bereinigungsroutine aufgerufen wird, löschen Sie anstelle eines vollständigen Verzeichnisscans mit geänderten Zeitprüfungen auf der Grundlage Ihres Datensatzes und löschen Sie gelöschte Einträge aus dem Datensatz. Speichern Sie Ihren Datensatz beispielsweise als JSON-Datei oder als CSV / TSV. Dies sollte eine erhebliche Beschleunigung in Fällen bewirken, in denen aufgrund der Verringerung des Dateisystemzugriffs ein erhebliches Dateivolumen vorhanden ist.
Wenn Sie Ihre Benutzer nicht mit der Bereinigungsverzögerung belästigen möchten, verschieben Sie die Routine von benutzerbezogenen Dateien in Nur-Administrator-Dateien oder führen Sie eine Administrator-Benutzerprüfung durch und passen Sie den Auslöser für die Bereinigungshäufigkeit an (in OP mit 1:20), um die Nutzungshäufigkeit des Administrators anzupassen. Dies kann natürlich die Bereinigungshäufigkeit verringern (wenn Administratoren nicht in der Nähe sind), entlastet jedoch die Öffentlichkeit.
Schließlich werden Sie natürlich Mr. Cron und lösen die Bereinigung von Zeit zu Zeit manuell aus, täglich oder bevor Ihrem Server der Speicherplatz ausgeht. Im Allgemeinen scheint es nicht notwendig zu sein, alle 20 Seitenaufrufe oder so zu bereinigen, es sei denn, Sie haben sehr wenig Platz. Ich habe keine Ahnung von der Menge der generierten PDF-Dateien, dem Datenverkehr oder den Serverressourcen, daher ist es schwierig, empfohlene Zahlen zur Bereinigungshäufigkeit zu ermitteln.
Dies ist ein schlechtes Konzept. Verwenden Sie für diesen Job den Cronjob-Scheduler . Hier ist bash oneliner, um alle Dateien im Ordner / tmp / some_path zu löschen, wenn der Ordnerinhalt 10 MB überschreitet (bitte entsprechend Ihren Anforderungen ändern):
SIZE=$(du -bs --block-size=1M /tmp/some_path | cut -f1); if [[ $SIZE -gt 10 ]];then echo "Folder '/tmp/some_path' has size ($SIZE MB)."; rm -r /tmp/some_path/*; fi
Sie können über diesen Code in script.sh (enthalten shebang zB für bash. #!/bin/bash
An der Spitze und Make - Datei ausführbar dh. chmod +x script.sh
), Dann append neue Zeile zu cronjob Scheduler (zB crontab -e
) auf Ordnergröße zu überprüfen jede Stunde :
0 * * * * <path_to_the_script>/script.sh
Mehr über Cronjobs finden Sie hier: https://crontab.guru