ftp_rawlist()
Die PHP-Funktion ftp_rawlist() gibt eine detaillierte Verzeichnisliste eines FTP-Servers zurück. Erfahren Sie mehr über Syntax, Parsing und Fehlerbehandlung.
Die PHP-Funktion ftp_rawlist() verstehen
Die Funktion ftp_rawlist() gibt eine detaillierte Verzeichnisliste auf einem FTP-Server zurück. Jedes Element des zurückgegebenen Arrays ist eine Zeile der rohen LIST-Ausgabe des Servers — derselbe Text, den Sie in einem Terminal-FTP-Client sehen würden, einschließlich Dateiberechtigungen, Eigentümer, Größe und Änderungsdatum.
Diese Seite erklärt, was ftp_rawlist() zurückgibt, die Syntax, ein vollständiges Arbeitsbeispiel, wie man die rohen Zeilen in nutzbare Daten parst, rekursive Listings und die Fehlerbehandlung. Wenn Sie nur die Dateinamen in einem Verzeichnis benötigen, verwenden Sie stattdessen ftp_nlist() — es ist einfacher und wesentlich leichter zu parsen.
Was ist ftp_rawlist()?
ftp_rawlist() akzeptiert zwei erforderliche Parameter und einen optionalen Parameter:
- ftp_stream — das Verbindungsobjekt (PHP 8.1+) oder die Ressource, die von
ftp_connect()(oderftp_ssl_connect()) zurückgegeben wird. - directory — das aufzulistende Verzeichnis.
- recursive (optional) — auf
truesetzen, um Unterverzeichnisse rekursiv aufzulisten.
Bei Erfolg gibt die Funktion ein array of strings zurück, wobei jeder string eine rohe Ausgabezeile ist; bei einem Fehler (oder für ein leeres Verzeichnis, das nicht gelesen werden kann) gibt sie false zurück.
Der wesentliche Punkt ist, dass diese Ausgabe nicht standardisiert ist. Es handelt sich um das, was der LIST-Befehl des Servers ausgibt, sodass das Format vom Betriebssystem und der Konfiguration des Servers abhängt. Ein Unix-ähnlicher Server gibt typischerweise Zeilen zurück, die wie die Ausgabe von ls -l aussehen:
drwxr-xr-x 2 owner group 4096 Jun 21 10:00 images
-rw-r--r-- 1 owner group 10240 Jun 20 14:32 index.htmlWindows/DOS-ähnliche Server verwenden ein völlig anderes Layout. Deshalb bietet ftp_rawlist() vollständige Details auf Kosten der Notwendigkeit, Freitext selbst zu parsen. Im Vergleich dazu:
ftp_nlist()— gibt ein einfaches array nur mit Dateinamen zurück.ftp_mlsd()— gibt ein maschinenlesbares, strukturiertes Listing zurück (bevorzugt, wenn der Server denMLSD-Befehl unterstützt).
Syntax von ftp_rawlist()
Die Syntax der Funktion ftp_rawlist() lautet wie folgt:
Syntax von ftp_rawlist()
array ftp_rawlist ( FTP\Connection|resource $ftp_stream , string $directory [, bool $recursive = false ] )Die Funktion ftp_rawlist() erwartet zwei erforderliche Parameter, ftp_stream und directory. Der Parameter ftp_stream ist der Verbindungsbezeichner, der von der Funktion ftp_connect() zurückgegeben wird, und der Parameter directory ist das aufzulistende Verzeichnis. Die Funktion hat außerdem einen optionalen Parameter, recursive, mit dem Sie angeben können, ob Unterverzeichnisse aufgelistet werden sollen.
Verwendung von ftp_rawlist()
Um die Funktion ftp_rawlist() zu verwenden, müssen Sie zunächst eine Verbindung zum FTP-Server mithilfe der Funktion ftp_connect() herstellen. Hier ist ein Beispiel:
Verwendung von ftp_rawlist()
<?php
// Set up an FTP connection
$conn = ftp_connect('ftp.example.com');
if (!$conn) {
die("Could not connect to FTP server.");
}
// Login with your FTP credentials
if (!ftp_login($conn, 'username', 'password')) {
die("Login failed.");
}
// Get a detailed listing of the directory
$listing = ftp_rawlist($conn, '/public_html');
// Output the listing to the console
if ($listing) {
foreach ($listing as $item) {
echo $item . "\n";
}
}
// Close the FTP connection
ftp_close($conn);
?>Hier verbinden wir uns mit ftp_connect(), authentifizieren uns mit ftp_login(), rufen das Listing mit ftp_rawlist() ab, geben jede rohe Zeile aus und schließen schließlich die Verbindung mit ftp_close().
Tipp — Passivmodus: Viele Netzwerke und Firewalls blockieren den Aktivmodus-Datenkanal, den
ftp_rawlist()zum Abrufen des Listings verwendet, wodurch die Funktion hängt oderfalsezurückgibt. Wenn das passiert, aktivieren Sie den Passivmodus mitftp_pasv($conn, true)nach dem Einloggen.
Sicherheitshinweis: Standard-FTP überträgt Anmeldedaten und Daten im Klartext. Für Produktionsumgebungen sollten Sie
ftp_ssl_connect()für explizites FTP über TLS verwenden oder zu SFTP (über diessh2-Erweiterung) für verschlüsselte Übertragungen wechseln.
Das rohe Listing parsen
Da jede Zeile unstrukturierter Text ist, möchten Sie in der Regel einzelne Felder extrahieren. Bei einem Unix-ähnlichen Server können Sie jede Zeile an Leerzeichen aufteilen: Die Berechtigungen sind das erste Token, die Größe ist das fünfte, und der Dateiname ist alles nach dem achten Token (der Name kann Leerzeichen enthalten).
Parsen eines Unix-ähnlichen rohen Listings
<?php
// One line of typical ftp_rawlist() output:
$line = '-rw-r--r-- 1 owner group 10240 Jun 20 14:32 index.html';
// Split on runs of whitespace, limited so the name stays intact.
$parts = preg_split('/\s+/', $line, 9);
$type = $parts[0][0] === 'd' ? 'directory' : 'file';
$permissions = $parts[0];
$size = (int) $parts[4];
$name = $parts[8];
echo "Name: $name\n";
echo "Type: $type\n";
echo "Size: $size bytes\n";
echo "Permissions: $permissions\n";
?>Dies gibt aus:
Name: index.html
Type: file
Size: 10240 bytes
Permissions: -rw-r--r--Wenn Ihr Server es unterstützt, bevorzugen Sie ftp_mlsd(), das diese Daten bereits strukturiert zurückgibt, sodass Sie das fehleranfällige String-Parsing überspringen können.
Unterverzeichnisse rekursiv auflisten
Die Übergabe von true als drittes Argument weist den Server an, in Unterverzeichnisse abzusteigen. Die Ausgabe enthält dann Leerzeilen und Verzeichnis-Header (ein Pfad gefolgt von einem Doppelpunkt), die den Inhalt jedes Unterverzeichnisses trennen — seien Sie darauf vorbereitet, diese beim Iterieren zu überspringen:
<?php
// Assuming $conn is an active FTP connection
$listing = ftp_rawlist($conn, '/public_html', true);
foreach ($listing as $line) {
if ($line === '' || str_ends_with($line, ':')) {
// Skip blank separators and "/path/to/dir:" headers
continue;
}
echo $line . "\n";
}
?>Beachten Sie, dass nicht jeder FTP-Server das rekursive Flag berücksichtigt und ein tiefer Verzeichnisbaum langsam sein kann — testen Sie daher mit Ihrem Zielserver.
Fehlerbehandlung in ftp_rawlist()
Es ist wichtig, Fehler bei der Verwendung der Funktion ftp_rawlist() ordnungsgemäß zu behandeln. Gibt die Funktion false zurück, war die Operation nicht erfolgreich. Hier ist ein Beispiel für die Fehlerbehandlung:
Fehlerbehandlung in ftp_rawlist()
<?php
// Assuming $conn is an active FTP connection
$listing = ftp_rawlist($conn, '/public_html');
if (!$listing) {
echo "Failed to get directory listing from FTP server.\n";
}
ftp_close($conn);
?>Indem Sie Fehler angemessen behandeln und den Rückgabewert der Funktion überprüfen, können Sie den Erfolg Ihrer FTP-Operationen mit der Funktion ftp_rawlist() sicherstellen.
Fazit
ftp_rawlist() ist die Funktion der Wahl, wenn Sie vollständige Datei-Metadaten — Berechtigungen, Eigentümer, Größe und Datum — aus einem FTP-Verzeichnis benötigen, nicht nur Namen. Der Kompromiss besteht darin, dass die Ausgabe der rohe, betriebssystemabhängige LIST-Text des Servers ist, also planen Sie das Parsing ein (oder verwenden Sie das strukturierte ftp_mlsd(), wo verfügbar). Überprüfen Sie immer den Rückgabewert, aktivieren Sie den Passivmodus hinter einer Firewall und bevorzugen Sie eine verschlüsselte Verbindung für die Produktion.
Verwandte Funktionen
ftp_nlist()— nur Dateinamen auflistenftp_mlsd()— strukturiertes, maschinenlesbares Listingftp_connect()/ftp_login()— Sitzung öffnen und authentifizierenftp_get()— eine Datei herunterladen, sobald sie gefunden wurdeftp_close()— die Verbindung schließen