Start · Sprachen · PHP · Referenz · ftp_nb_continue

ftp_nb_continue

Funktion

Setzt eine laufende nicht-blockierende FTP-Dateiübertragung fort und gibt den aktuellen Übertragungsstatus zurück.

seit PHP 4.3.0 Kategorie: io

Signatur

ftp_nb_continue(FTP\Connection $ftp): int

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

Typ
int
Beschreibung
Gibt eine der folgenden Konstanten zurück: 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);
......... Download erfolgreich abgeschlossen.

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);
Übertrage... (Schritt 1) Übertrage... (Schritt 2) Übertrage... (Schritt 3) Upload erfolgreich!

// 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.