Im Folgenden zeige ich euch, wie man mehrere Textdateien gleichzeitig aus einem Ordner auf einem FTP-Server durch PHP ausliest und in eine Variable speichert. Dabei sollen nur Textdateien berücksichtigt werden. Zusätzlich dürfen ebenfalls nur Dateien ausgelesen werden, welche ein bestimmtes Änderungsdatum aufweist. Eine praktische Anwendung kann unter anderem das Zusammenführen mehrerer einzelner Logfiles sein.
Als erstes bauen wir eine Verbindung zum FTP-Server auf:
$data = "";
$ftp_server = "ftpserverxyz.de";
$ftp_user = "anonymous";
$ftp_pass = "anonymous";
//Mit FTP verbinden
$conn_id = ftp_connect($ftp_server);
// Login mit Username und Passwort
if(!($login_result = ftp_login($conn_id, $ftp_user, $ftp_pass))) {
ftp_close($conn_id);
return;
}
// Schalte passiven Modus ein
ftp_pasv($conn_id, true);
Als nächstes wechseln wir das Verzeichnis auf dem FTP-Server, wo sich unsere Dateien befinden:
// Nach Verzeichnis .... wechseln
ftp_chdir($conn_id, "verzeichnis/auf/dem/server/");
Über die PHP-Funktion ftp_nlist werden alle Dateien im gewählten Verzeichnis aufgelistet. Über das zweite Argument können die Dateien gefiltert werden. In unserem Fall sollen nur Textdateien mit einer Endung .txt herangezogen werden.
$ftp_nlist_root = ftp_nlist($conn_id, "*.txt");
Für das spätere Selektieren der Dateien nach einem bestimmten Alter der Datei geben wir einen Zeitraum von einer Stunde an:
$timerange = time() - (60*60);
Zum Schluss der wichtigste Teil des Quelltextes: Die Foreach-Schleife durchläuft jedes Arrayelement (gleichbedeutend mit jedem Dateieintrag) aus der Variable $ftp_nlist_root und prüft das Änderungsdatum der Datei. Wenn es innerhalb der angegebenen letzten Stunde ist, dann wird es für die Ausgabe berücksichtigt und per ftp_get als Stream in die Variable $data hinzugefügt.
foreach ($ftp_nlist_root as $file) {
$mod = ftp_mdtm($conn_id, $file);
if ($mod >= $timerange) {
ob_start();
$result = ftp_get($conn_id, "php://output", $file, FTP_ASCII);
$data .= ob_get_contents();
ob_end_clean();
}
}
ftp_close($conn_id);
Zusammenfassend nachfolgend noch einmal der komplette Quelltext für diese Anforderung:
<?php
$data = "";
$ftp_server = "ftpserverxyz.de";
$ftp_user = "anonymous";
$ftp_pass = "anonymous";
//Mit FTP verbinden
$conn_id = ftp_connect($ftp_server);
// Login mit Username und Passwort
if(!($login_result = ftp_login($conn_id, $ftp_user, $ftp_pass))) {
ftp_close($conn_id);
return;
}
// Schalte passiven Modus ein
ftp_pasv($conn_id, true);
// Nach Verzeichnis .... wechseln
ftp_chdir($conn_id, "verzeichnis/auf/dem/server/");
//Liste alle Dateien auf, welche eine Dateiendung .txt besitzen
$ftp_nlist_root = ftp_nlist($conn_id, "*.txt");
//Sortiere Array
$timerange = time() - (60*60);
foreach ($ftp_nlist_root as $file) {
$mod = ftp_mdtm($conn_id, $file);
if ($mod >= $timerange) {
ob_start();
$result = ftp_get($conn_id, "php://output", $file, FTP_ASCII);
$data .= ob_get_contents();
ob_end_clean();
}
}
ftp_close($conn_id);
?>
Hi Thomas,
ich möchte von WordPress aus per FTP auf einen Ordner des Servers zugreifen und ZIP-Dateien löschen, welche z. B. älter als 2 Monate sind. Es handelt sich dabei um Backup-Dateien, welche nicht mehr benötigt werden.
Kann man dein Script dahingehend umbauen?
Für einen guten Tipp wäre ich dankbar.
LG Hans
Hallo Hans,
für dein Vorhaben ist ein zusätzlicher FTP-Zugang nicht nötig und die Aufgabe könnte mit Cronjobs automatisch durchgeführt werden.
Wenn bei deinem Webhoster SSH möglich ist, kannst du mit dem folgenden Befehl alle Dateien im angegebenen Ordner mit einem Änderungsdatum älter als 2 Monate löschen:
find /pfad/zu/den/dateien* -mtime +60 -exec rm {} \;
Mit PHP gibt es Möglichkeiten mit opendir und unlink. Hier findest du auf Github ein gutes Beispiel, wie man dies lösen könnte:
https://gist.github.com/tdebatty/9412259
Hallo Thomas,
vielen Dank für die Info und den Tipp mit dem Script auf GitHub. Dieses Script ist leider nicht für eine FTP-Verbindung vorgesehen. Mit SSH habe ich keine Erfahrung, dafür eher mit PHP (etliche Plugins gebaut).
Mein Hoster all-inkl.com stellt zum regelmäßigen Löschen ein eigenes Script zur Verfügung, das auch gut funktioniert. Nun habe ich aber noch Backup-Files auf meinem NAS, wo ich anders vorgehen muss. Bisher wurden die Files immer manuell gelöscht, aber auf Dauer ist das zu umständlich. Bei weiteren Recherchen habe ich dieses Script gefunden:
https://www.carnaghan.com/knowledge-base/php-script-that-deletes-files-within-a-remote-directory-via-ftp-older-than-a-given-amount-of-days/
Es scheint für meinen Zweck geeignet zu sein. Vermutlich werde ich das Script noch etwas anpassen und entweder in ein Plugin einbauen oder ein Snippet-Plugin dazu nutzen.
LG Hans