Signatur
Beschreibung
Die PHP-Stream-Wrapper ftp:// und ftps:// ermöglichen den direkten Zugriff auf Dateien und Verzeichnisse auf FTP-Servern über Standard-Dateifunktionen wie fopen(), file_get_contents(), file_put_contents() oder copy(). Der Wrapper ftps:// verwendet dabei eine SSL/TLS-verschlüsselte Verbindung (FTP über explizites TLS, auch FTPES genannt).
Das URL-Format lautet: ftp://[benutzer[:passwort]@]hostname[:port]/pfad/zur/datei. Wird kein Benutzername angegeben, versucht PHP einen anonymen Login. Der Standardport für FTP ist 21. Der Wrapper unterstützt sowohl lesenden als auch schreibenden Zugriff; gleichzeitiges Lesen und Schreiben (read-write) ist jedoch nicht möglich.
Mit file_get_contents() lassen sich Dateien bequem herunterladen, mit file_put_contents() oder einem kombinierten fopen()/fwrite()-Block können Dateien auf den Server hochgeladen werden. Verzeichnisinhalte lassen sich mit opendir() und readdir() auflisten, sofern die PHP-Konfiguration allow_url_fopen aktiviert ist.
Für komplexere FTP-Operationen (Umbenennen, Löschen, Berechtigungen setzen) empfiehlt sich die dedizierte FTP-Erweiterung mit Funktionen wie ftp_connect(), die mehr Kontrolle über die Verbindung bietet. Der Stream-Wrapper eignet sich vor allem für einfache Lese-/Schreiboperationen in kleinen Skripten oder Schnellzugriffen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $url Pflicht | string | Vollständige FTP-URL im Format ftp://[user[:pass]@]host[:port]/pfad oder ftps://... für TLS-verschlüsselte Verbindungen. |
|
| $mode | string | r | Dateimodus bei fopen(): r zum Lesen, w zum Schreiben (überschreiben), a zum Anhängen. Gleichzeitiges Lesen und Schreiben (r+) wird nicht unterstützt. |
| $context | resource | Optionaler Stream-Kontext, erstellt mit stream_context_create(). Erlaubt das Setzen von FTP-Optionen wie overwrite, resume_pos oder proxy. |
Rückgabewert
fopen() liefert ein Stream-resource oder false bei Fehler; file_get_contents() liefert den Dateiinhalt als string oder false; file_put_contents() liefert die Anzahl geschriebener Bytes oder false.Beispiele
Datei von FTP-Server herunterladen
<?php
// Dateiinhalt von einem FTP-Server lesen
$url = 'ftp://benutzer:geheim@ftp.example.com/pub/daten.txt';
$inhalt = file_get_contents($url);
if ($inhalt === false) {
echo 'Fehler beim Abrufen der Datei.';
} else {
echo 'Dateigröße: ' . strlen($inhalt) . ' Bytes';
echo "\n" . $inhalt;
}
Datei per FTPS (TLS) hochladen mit Stream-Kontext
<?php
// Datei verschlüsselt auf FTPS-Server hochladen
$context = stream_context_create([
'ftp' => [
'overwrite' => true, // Vorhandene Datei überschreiben
],
]);
$lokaleDaten = 'Dies sind die Uploadinhalte.';
$zielUrl = 'ftps://benutzer:geheim@ftp.example.com/upload/test.txt';
$bytes = file_put_contents($zielUrl, $lokaleDaten, 0, $context);
if ($bytes === false) {
echo 'Upload fehlgeschlagen.';
} else {
echo "Upload erfolgreich: {$bytes} Bytes übertragen.";
}
Verzeichnisinhalt eines FTP-Servers auflisten
<?php
// Verzeichnis auf FTP-Server auflesen
$handle = opendir('ftp://benutzer:geheim@ftp.example.com/pub/');
if ($handle === false) {
echo 'Verzeichnis konnte nicht geöffnet werden.';
} else {
while (($eintrag = readdir($handle)) !== false) {
if ($eintrag !== '.' && $eintrag !== '..') {
echo $eintrag . "\n";
}
}
closedir($handle);
}
// Wichtig · Fallstricke
Sicherheit: Zugangsdaten (Benutzername und Passwort) werden im Klartext in der URL übergeben. Speichere solche URLs niemals direkt in öffentlich zugänglichem Code oder Logs. Verwende stattdessen Umgebungsvariablen oder gesicherte Konfigurationsdateien.
allow_url_fopen: Der Wrapper setzt voraus, dass allow_url_fopen = On in der php.ini gesetzt ist. In vielen gehosteten Umgebungen ist dies aus Sicherheitsgründen deaktiviert — überprüfe die Serverkonfiguration.
Passiver Modus: PHP verwendet für FTP-Stream-Wrapper standardmäßig den passiven Modus. Bei Verbindungsproblemen hinter Firewalls kann das Setzen des Kontextparameters 'passive_mode' => true (je nach PHP-Version) helfen.
Kein gleichzeitiges Lesen/Schreiben: Der Modus r+ wird nicht unterstützt. Für komplexere Operationen wie Umbenennen oder Löschen sollte die FTP-Erweiterung (ftp_connect(), ftp_rename() usw.) verwendet werden.