PHP FTP
FTP (File Transfer Protocol) ist ein Netzwerkprotokoll zum Übertragen von Dateien zwischen Client und Server. PHP bietet eine eingebaute FTP-Erweiterung.
Einführung
FTP (File Transfer Protocol) ist ein standardisiertes Netzwerkprotokoll zur Übertragung von Dateien zwischen einem Client und einem Server über eine TCP-Verbindung. PHP enthält eine eingebaute FTP-Erweiterung (ext-ftp), mit der Skripte sich bei einem Remote-Server anmelden und Dateien programmatisch verschieben können — nützlich zum Bereitstellen von Assets, Synchronisieren von Backups oder Abrufen von Datenfeeds vom Server eines Partners.
Dieses Kapitel behandelt den vollständigen Workflow: Verbinden, Anmelden, Wechseln in den passiven Modus, Hoch- und Herunterladen, Auflisten und Verwalten von Remote-Dateien sowie das saubere Schließen der Verbindung. Es werden auch die Sicherheitshinweise erläutert, die Sie kennen müssen, bevor Sie einfaches FTP in der Produktion verwenden.
Sicherheitshinweis zuerst. Einfaches FTP sendet Benutzername, Passwort und Dateiinhalte unverschlüsselt. Für sensible Daten verwenden Sie
ftp_ssl_connect()(FTP über TLS) oder bevorzugen SFTP (SSH File Transfer Protocol), das die FTP-Erweiterung nicht unterstützt — nutzen Sie die PHP SSH2-Erweiterung oder eine Bibliothek wie phpseclib für SFTP.
Der typische FTP-Workflow
Jedes FTP-Skript folgt derselben Struktur, unabhängig davon, welche Operation ausgeführt wird:
- Verbinden mit dem Server —
ftp_connect()(oderftp_ssl_connect()für FTPS). - Authentifizieren —
ftp_login(). - Konfigurieren — üblicherweise
ftp_pasv($conn, true)zum Aktivieren des passiven Modus. - Dateien übertragen / verwalten —
ftp_put(),ftp_get(),ftp_nlist()usw. - Schließen —
ftp_close().
Verbindung zu einem FTP-Server herstellen
Stellen Sie eine Verbindung mit ftp_connect() her. Die Funktion nimmt den Hostnamen (sowie optionalen Port und Timeout) entgegen und gibt bei Erfolg ein FTP\Connection-Objekt zurück (vor PHP 8.1 eine Ressource) oder false bei einem Fehler.
<?php
$conn = ftp_connect("ftp.example.com", 21, 10); // host, port, timeout (seconds)
if ($conn === false) {
die("Could not connect to FTP server");
}
echo "Connected.";Beachten Sie, dass die Verbindung Sie nicht anmeldet — zu diesem Zeitpunkt haben Sie einen anonymen, nicht authentifizierten Kanal. Sie müssen noch ftp_login() aufrufen, bevor der Server Ihnen erlaubt, etwas Nützliches zu tun.
FTPS verwenden (FTP über TLS)
Um die Steuer- und Datenkanäle zu verschlüsseln, ersetzen Sie ftp_connect() durch ftp_ssl_connect(). Der Rest der API ist identisch:
<?php
$conn = ftp_ssl_connect("ftp.example.com");
if ($conn === false) {
die("Could not open a secure FTP connection");
}Anmelden und passiver Modus
Nach dem Verbinden authentifizieren Sie sich mit ftp_login(). Bei öffentlichen Servern, die anonymen Zugang erlauben, verwenden Sie den Benutzernamen anonymous mit einem E-Mail-ähnlichen Passwort.
<?php
$conn = ftp_connect("ftp.example.com");
if (!ftp_login($conn, "username", "password")) {
ftp_close($conn);
die("Login failed");
}
// Most networks behind a firewall/NAT require passive mode.
ftp_pasv($conn, true);
echo "Logged in.";Warum der passive Modus wichtig ist. Im aktiven Modus öffnet der Server eine Datenverbindung zurück zu Ihrem Client, was Firewalls und NAT-Router fast immer blockieren. Im passiven Modus öffnet der Client stattdessen die Datenverbindung zum Server, sodass es hinter Firewalls funktioniert. Als Faustregel gilt: Rufen Sie ftp_pasv($conn, true) direkt nach dem Anmelden auf. Es muss nach ftp_login() gesetzt werden, nicht davor.
Dateien hochladen
Verwenden Sie ftp_put(), um eine lokale Datei auf den Server zu senden. Die Signatur lautet ftp_put($conn, $remote_file, $local_file, $mode), wobei $mode FTP_BINARY oder FTP_ASCII ist.
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);
if (ftp_put($conn, "/public_html/report.pdf", "report.pdf", FTP_BINARY)) {
echo "Upload successful";
} else {
echo "Upload failed";
}
ftp_close($conn);FTP_BINARY vs. FTP_ASCII. Verwenden Sie FTP_BINARY für alles, was kein reiner Text ist — Bilder, PDFs, Archive, ausführbare Dateien — da der ASCII-Modus Zeilenenden umschreibt und Binärdaten beschädigt. Verwenden Sie FTP_ASCII nur dann, wenn Sie eine Übersetzung von Zeilenenden zwischen Plattformen für Textdateien ausdrücklich wünschen. Im Zweifelsfall wählen Sie FTP_BINARY; es ist die sichere Standardoption.
Für große Dateien können Sie mit ftp_nb_put() nicht-blockierend hochladen, wodurch Ihr Skript zwischen den Blöcken andere Arbeit erledigen kann.
Dateien herunterladen
ftp_get() lädt eine Remote-Datei in das lokale Dateisystem herunter. Die Argumentreihenfolge ist ftp_get($conn, $local_file, $remote_file, $mode) — beachten Sie, dass das lokale Ziel zuerst kommt, das Gegenteil von ftp_put(). Diese Verwechslung ist der häufigste FTP-Fehler.
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);
// local_file first, then remote_file
if (ftp_get($conn, "backup.zip", "/backups/backup.zip", FTP_BINARY)) {
echo "Download successful";
} else {
echo "Download failed";
}
ftp_close($conn);Remote-Dateien auflisten und verwalten
Die FTP-Erweiterung kann weit mehr als nur Dateien übertragen. Häufig verwendete Verwaltungsfunktionen umfassen:
| Funktion | Zweck |
|---|---|
ftp_nlist($conn, $dir) | Array mit Dateinamen in einem Verzeichnis |
ftp_rawlist($conn, $dir) | Detaillierte Auflistung im ls -l-Stil |
ftp_size($conn, $file) | Dateigröße in Bytes (-1 bei Fehler) |
ftp_mkdir($conn, $dir) | Verzeichnis erstellen |
ftp_rmdir($conn, $dir) | (Leeres) Verzeichnis entfernen |
ftp_delete($conn, $file) | Datei löschen |
ftp_rename($conn, $from, $to) | Datei umbenennen / verschieben |
ftp_chdir($conn, $dir) | Arbeitsverzeichnis wechseln |
ftp_pwd($conn) | Aktuelles Arbeitsverzeichnis |
ftp_chmod($conn, 0644, $file) | Dateiberechtigungen ändern |
<?php
$conn = ftp_connect("ftp.example.com");
ftp_login($conn, "username", "password");
ftp_pasv($conn, true);
$files = ftp_nlist($conn, "/public_html");
foreach ($files as $file) {
echo $file, " — ", ftp_size($conn, $file), " bytes\n";
}
ftp_close($conn);Verbindung schließen
Geben Sie die Verbindung mit ftp_close() immer frei, wenn Sie fertig sind. Das Einschließen des Workflows in try/finally stellt sicher, dass der Socket geschlossen wird, auch wenn ein Fehler mitten im Prozess auftritt:
<?php
$conn = ftp_connect("ftp.example.com");
if (!$conn || !ftp_login($conn, "username", "password")) {
die("Connection or login failed");
}
try {
ftp_pasv($conn, true);
ftp_put($conn, "/public_html/index.html", "index.html", FTP_BINARY);
} finally {
ftp_close($conn);
}Best Practices und häufige Fallstricke
- Bevorzugen Sie FTPS oder SFTP. Senden Sie niemals Anmeldedaten über einfaches FTP über das öffentliche Internet.
- Aktivieren Sie immer den passiven Modus (
ftp_pasv), sofern kein spezifischer Grund dagegen spricht. - Wählen Sie den richtigen Übertragungsmodus —
FTP_BINARYfür Binärdaten,FTP_ASCIInur für Text, bei dem eine Zeilenende-Übersetzung gewünscht ist. - Beachten Sie die Argumentreihenfolge —
ftp_putist(remote, local),ftp_getist(local, remote). - Schließen Sie immer die Verbindung mit
ftp_close(). - Prüfen Sie jeden Rückgabewert. FTP-Funktionen geben bei einem Fehler
falsezurück, anstatt eine Ausnahme zu werfen, sodass stille Fehler leicht übersehen werden können. ext-ftpmuss aktiviert sein. Prüfen Sie dies mitextension_loaded('ftp'); wenn esfalsezurückgibt, aktivieren Sie die Erweiterung in Ihrerphp.ini.
Verwandte Themen
- PHP-Dateiverarbeitung — Lesen und Schreiben lokaler Dateien.
- PHP-Datei-Upload — Verarbeitung von HTTP-Formular-Uploads.
- PHP-Dateisystem — der umfangreichere Satz von Dateisystemfunktionen.
- PHP-Ausnahmen — strukturierte Fehlerbehandlung für
try/finally.