Start · Sprachen · PHP · Referenz · ftp_mlsd

ftp_mlsd

Funktion

Liefert eine detaillierte Liste der Dateien und Verzeichnisse im angegebenen FTP-Verzeichnis als Array mit Metadaten.

seit PHP 7.2.0 Kategorie: io

Signatur

ftp_mlsd(FTP\Connection $ftp, string $directory): array|false

Beschreibung

ftp_mlsd() ruft eine strukturierte Verzeichnisliste vom FTP-Server ab, die auf dem standardisierten MLSD-Befehl (Machine Listing Directory) gemäß RFC 3659 basiert. Im Gegensatz zu ftp_nlist() oder ftp_rawlist() liefert diese Funktion maschinenlesbare, einheitlich formatierte Metadaten zu jeder Datei und jedem Verzeichnis.

Der Rückgabewert ist ein Array von assoziativen Arrays, wobei jeder Eintrag mindestens den Schlüssel name (Dateiname) sowie je nach Serverkonfiguration weitere Fakten wie type (z. B. file, dir, cdir, pdir), size, modify (Zeitstempel im Format YYYYMMDDHHmmss) und Berechtigungen (unix.mode, perm) enthält.

Diese Funktion eignet sich besonders gut für automatisierte FTP-Clients, Synchronisierungswerkzeuge und Backup-Skripte, bei denen zuverlässige und plattformunabhängige Datei-Metadaten benötigt werden. Da das MLSD-Format serverseitig standardisiert ist, entfällt das fehleranfällige Parsen von ftp_rawlist()-Ausgaben.

Beachte, dass nicht alle FTP-Server den MLSD-Befehl unterstützen. In diesem Fall gibt die Funktion false zurück. Für ältere Server muss auf ftp_rawlist() oder ftp_nlist() zurückgegriffen werden.

Parameter

Name Typ Default Beschreibung
$ftp Pflicht FTP\Connection Eine gültige FTP-Verbindungsressource, wie sie von ftp_connect() oder ftp_ssl_connect() zurückgegeben wird.
$directory Pflicht string Pfad des Verzeichnisses auf dem FTP-Server, dessen Inhalt aufgelistet werden soll. Ein leerer String oder . steht für das aktuelle Arbeitsverzeichnis.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array von assoziativen Arrays zurück. Jedes innere Array repräsentiert einen Verzeichniseintrag und enthält mindestens den Schlüssel name sowie weitere vom Server bereitgestellte Fakten (z. B. type, size, modify, perm). Wird false zurückgegeben, wenn der MLSD-Befehl fehlschlägt oder vom Server nicht unterstützt wird.

Beispiele

Verzeichnisinhalt mit Metadaten auflisten

<?php
$ftp = ftp_connect('ftp.example.com');
if (!$ftp) {
    die('Verbindung fehlgeschlagen');
}

if (!ftp_login($ftp, 'benutzer', 'passwort')) {
    die('Anmeldung fehlgeschlagen');
}

$eintraege = ftp_mlsd($ftp, '/public_html');

if ($eintraege === false) {
    echo 'MLSD wird vom Server nicht unterstützt oder Verzeichnis nicht gefunden.';
} else {
    foreach ($eintraege as $eintrag) {
        $name = $eintrag['name'];
        $typ  = $eintrag['type'] ?? 'unbekannt';
        $groesse = isset($eintrag['size']) ? $eintrag['size'] . ' Bytes' : 'n/a';
        echo "[$typ] $name — $groesse\n";
    }
}

ftp_close($ftp);
[cdir] . — n/a [pdir] .. — n/a [dir] images — n/a [file] index.php — 4823 Bytes [file] style.css — 1247 Bytes

Nur Dateien filtern und nach Änderungsdatum sortieren

<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzer', 'passwort');

$eintraege = ftp_mlsd($ftp, '/backups');

if ($eintraege === false) {
    die('Verzeichnis konnte nicht gelesen werden.');
}

// Nur reguläre Dateien
$dateien = array_filter($eintraege, fn($e) => ($e['type'] ?? '') === 'file');

// Nach Änderungsdatum absteigend sortieren
usort($dateien, fn($a, $b) => strcmp($b['modify'] ?? '', $a['modify'] ?? ''));

foreach ($dateien as $datei) {
    $datum = isset($datei['modify'])
        ? DateTime::createFromFormat('YmdHis', $datei['modify'])->format('d.m.Y H:i:s')
        : 'unbekannt';
    echo $datei['name'] . ' — geändert am: ' . $datum . "\n";
}

ftp_close($ftp);
backup_2024-06-01.tar.gz — geändert am: 01.06.2024 03:00:00 backup_2024-05-31.tar.gz — geändert am: 31.05.2024 03:00:00 backup_2024-05-30.tar.gz — geändert am: 30.05.2024 03:00:00

// Wichtig · Fallstricke

Serverkompatibilität: ftp_mlsd() setzt voraus, dass der FTP-Server den RFC-3659-konformen MLSD-Befehl unterstützt. Viele ältere oder nicht standardkonforme Server unterstützen diesen Befehl nicht. Teste die Verfügbarkeit und halte einen Fallback auf ftp_rawlist() bereit.

Passiermodus: In vielen Netzwerkumgebungen (NAT, Firewall) muss vor der Verwendung ftp_pasv($ftp, true) aufgerufen werden, um den passiven Modus zu aktivieren, da sonst Datenverbindungen fehlschlagen können.

PHP-Version: Die Funktion ist erst ab PHP 7.2.0 verfügbar. In älteren Projekten steht sie nicht zur Verfügung.

Sicherheit: Verwende für Produktivumgebungen nach Möglichkeit ftp_ssl_connect() statt ftp_connect(), um Zugangsdaten und Daten verschlüsselt zu übertragen.