Signatur
Beschreibung
ftp_nb_continue() wird verwendet, um eine mit ftp_nb_get(), ftp_nb_put(), ftp_nb_fget() oder ftp_nb_fput() gestartete nicht-blockierende FTP-Übertragung schrittweise fortzusetzen. Die Funktion muss in einer Schleife aufgerufen werden, bis sie FTP_FINISHED oder FTP_FAILED zurückgibt.
Der nicht-blockierende Ansatz erlaubt es, während einer FTP-Übertragung andere Aufgaben im PHP-Skript auszuführen, anstatt auf den Abschluss der Übertragung zu warten. Dadurch kann beispielsweise ein Fortschrittsbalken aktualisiert oder eine parallele Verarbeitung simuliert werden.
Solange ftp_nb_continue() den Wert FTP_MOREDATA zurückgibt, ist die Übertragung noch nicht abgeschlossen. Erst bei FTP_FINISHED ist die Übertragung erfolgreich beendet worden, bei FTP_FAILED ist ein Fehler aufgetreten.
Diese Funktion ist besonders nützlich in lang laufenden Skripten, bei denen große Dateien übertragen werden und gleichzeitig andere Aktionen — wie das Aktualisieren einer Datenbank oder das Versenden von Benachrichtigungen — ausgeführt werden sollen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ftp Pflicht | FTP\Connection | Eine gültige FTP-Verbindungsressource, die mit ftp_connect() oder ftp_ssl_connect() erstellt wurde. Ab PHP 8.1 ist dies ein FTP\Connection-Objekt. |
Rückgabewert
FTP_MOREDATA solange die Übertragung noch läuft, FTP_FINISHED wenn die Übertragung erfolgreich abgeschlossen wurde, oder FTP_FAILED wenn ein Fehler aufgetreten ist.Beispiele
Nicht-blockierender FTP-Download mit Fortschrittsausgabe
<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzer', 'passwort');
ftp_pasv($ftp, true);
// Nicht-blockierenden Download starten
$status = ftp_nb_get($ftp, '/tmp/lokale_datei.zip', '/remote/datei.zip', FTP_BINARY);
// Übertragung schrittweise fortsetzen
while ($status === FTP_MOREDATA) {
// Hier können andere Aufgaben erledigt werden
echo '.';
flush();
// Übertragung weiter fortsetzen
$status = ftp_nb_continue($ftp);
}
if ($status === FTP_FINISHED) {
echo PHP_EOL . 'Download erfolgreich abgeschlossen.';
} else {
echo PHP_EOL . 'Download fehlgeschlagen.';
}
ftp_close($ftp);
Nicht-blockierender FTP-Upload mit Datenbankaktualisierung
<?php
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'benutzer', 'passwort');
ftp_pasv($ftp, true);
$lokaleDatei = '/tmp/bericht.pdf';
$remoteDatei = '/uploads/bericht.pdf';
// Upload nicht-blockierend starten
$status = ftp_nb_put($ftp, $remoteDatei, $lokaleDatei, FTP_BINARY);
$fortschritt = 0;
while ($status === FTP_MOREDATA) {
$fortschritt++;
// Simulierte Nebenaufgabe: Fortschritt in DB speichern
// $db->query("UPDATE uploads SET fortschritt = $fortschritt WHERE datei = 'bericht.pdf'");
echo "Übertrage... (Schritt {$fortschritt})" . PHP_EOL;
$status = ftp_nb_continue($ftp);
}
if ($status === FTP_FINISHED) {
echo 'Upload erfolgreich!';
} elseif ($status === FTP_FAILED) {
echo 'Upload fehlgeschlagen!';
}
ftp_close($ftp);
// Wichtig · Fallstricke
Wichtig: ftp_nb_continue() darf nur aufgerufen werden, nachdem eine nicht-blockierende Übertragung mit einer der ftp_nb_*-Funktionen gestartet wurde. Ein Aufruf ohne vorherige nicht-blockierende Übertragung führt zu undefiniertem Verhalten.
Ab PHP 8.1 wurde der Typ des $ftp-Parameters von resource zu FTP\Connection geändert. Bestehender Code, der resource-Typ-Checks verwendet, muss entsprechend angepasst werden.
Die Anzahl der Iterationen und die Datenmenge pro Iteration hängen von der Netzwerkbandbreite und den PHP-internen Puffergrößen ab und können nicht direkt gesteuert werden.