W3docs

ftp_nb_fget()

Die PHP-Funktion ftp_nb_fget() lädt eine Datei vom FTP-Server im nicht-blockierenden Modus herunter und schreibt sie in einen lokalen Datei-Pointer.

Die PHP-Funktion ftp_nb_fget() verstehen

Die Funktion ftp_nb_fget() ist eine eingebaute PHP-Funktion, die eine Datei von einem FTP-Server abruft und sie im nicht-blockierenden Modus in eine lokale Datei schreibt. Dieser Artikel bietet eine umfassende Anleitung zur Verwendung in PHP-Projekten.

Was ist ftp_nb_fget()?

Die Funktion ftp_nb_fget() ruft eine Remote-Datei ab und schreibt sie in einen bereits geöffneten lokalen Datei-Pointer, ohne das Skript zu blockieren. Nicht-blockierend bedeutet, dass der Aufruf sofort zurückkehrt, anstatt zu pausieren, bis die gesamte Datei übertragen wurde – so kann das Skript weiterarbeiten, während der Download im Hintergrund läuft.

Die Funktion nimmt vier Parameter entgegen (drei erforderliche, ein optionaler):

ParameterErforderlichBeschreibung
ftp_streamJaDer Verbindungsbezeichner, der von ftp_connect() zurückgegeben wird.
handleJaEin geöffneter lokaler Datei-Pointer (von fopen()), in den die Daten geschrieben werden.
remote_fileJaDer Pfad zur Datei auf dem FTP-Server.
modeJa (PHP < 7.3)Übertragungsmodus: FTP_ASCII oder FTP_BINARY. Optional und standardmäßig FTP_BINARY seit PHP 7.3.
resumeposNeinByte-Offset in der Remote-Datei, ab dem fortgesetzt werden soll. Standardwert ist 0.

Die Funktion gibt eine von drei Konstanten zurück:

  • FTP_FINISHED — die Übertragung wurde erfolgreich abgeschlossen.
  • FTP_MOREDATA — die Übertragung ist noch im Gange; rufen Sie ftp_nb_continue() auf, um fortzufahren.
  • FTP_FAILED — ein Fehler ist aufgetreten.

Blockierend vs. nicht-blockierend: Das blockierende Äquivalent ist ftp_fget(), das erst zurückkehrt, wenn die Datei vollständig übertragen wurde. Verwenden Sie ftp_nb_fget(), wenn Sie Fortschritt anzeigen, andere Arbeit erledigen oder mehrere Dateien quasi-parallel übertragen möchten.

Syntax von ftp_nb_fget()

Die Syntax der Funktion ftp_nb_fget() lautet wie folgt:

Syntax von ftp_nb_fget()

int ftp_nb_fget ( resource $ftp_stream , resource $handle , string $remote_file , int $mode [, int $resumepos = 0 ] )

Verwenden Sie FTP_BINARY für alle Nicht-Textdateien (Bilder, Archive, ausführbare Dateien), damit Bytes verbatim kopiert werden; FTP_ASCII übersetzt Zeilenenden und sollte nur für reine Textdateien verwendet werden. Der Parameter resumepos ist praktisch, um eine teilweise heruntergeladene Datei fortzusetzen: Übergeben Sie die Größe der lokalen Datei, damit die Übertragung dort weitermacht, wo sie aufgehört hat, anstatt von vorne zu beginnen.

Verwendung von ftp_nb_fget()

Um die Funktion ftp_nb_fget() zu verwenden, müssen Sie zunächst mit der Funktion ftp_connect() eine Verbindung zum FTP-Server herstellen. Hier ist ein Beispiel:

Verwendung von ftp_nb_fget()

<?php

// Set up an FTP connection
$conn = ftp_connect('ftp.example.com');
ftp_login($conn, 'username', 'password');

// Open a file for writing
$handle = fopen('local_file.txt', 'w');

// Initiate an asynchronous FTP operation
$result = ftp_nb_fget($conn, $handle, 'remote_file.txt', FTP_BINARY);

// Continue the asynchronous FTP operation
while ($result === FTP_MOREDATA) {
    // Do something else while waiting for the FTP operation to complete
    $result = ftp_nb_continue($conn);
}

// Check final result
if ($result === FTP_FINISHED) {
    echo "Download completed successfully.";
} else {
    echo "Download failed.";
}

fclose($handle);
ftp_close($conn);
?>

In diesem Beispiel stellen wir mit ftp_connect() eine Verbindung zum FTP-Server her. Anschließend melden wir uns mit ftp_login() an. Wir öffnen eine Datei zum Schreiben mit fopen() und initiieren einen asynchronen FTP-Vorgang mit ftp_nb_fget(). Wir setzen den Vorgang mit ftp_nb_continue() in einer while-Schleife fort, die auf die Konstante FTP_MOREDATA prüft. Abschließend prüfen wir das Ergebnis und schließen die Datei und die FTP-Verbindung.

Fehlerbehandlung in ftp_nb_fget()

Bei der Verwendung von ftp_nb_fget() ist eine ordnungsgemäße Fehlerbehandlung wichtig. Die Funktion und ftp_nb_continue() geben Zustandskonstanten zurück, keine einfachen booleschen Werte. Hier ist ein Beispiel für die Fehlerbehandlung und die Überprüfung von Übertragungszuständen:

Fehlerbehandlung in ftp_nb_fget()

<?php

// Assuming $conn is an established FTP connection
$handle = fopen('local_file.txt', 'w');
$result = ftp_nb_fget($conn, $handle, 'remote_file.txt', FTP_BINARY);

if ($result === FTP_FAILED) {
    echo "Failed to start download.\n";
} else {
    while ($result === FTP_MOREDATA) {
        $result = ftp_nb_continue($conn);
    }

    if ($result === FTP_FINISHED) {
        echo "Download completed successfully.\n";
    } else {
        echo "Download failed during transfer.\n";
    }
}

fclose($handle);
ftp_close($conn);
?>

Verwandte Funktionen

  • ftp_fget() — die blockierende Version, die in einen geöffneten Datei-Pointer herunterlädt.
  • ftp_nb_get() — nicht-blockierender Download direkt in einen lokalen Pfad (kein fopen() erforderlich).
  • ftp_nb_continue() — treibt die von ftp_nb_fget() gestartete Übertragung voran.
  • ftp_nb_fput() — das nicht-blockierende Gegenstück zum Hochladen.
  • ftp_connect() und ftp_login() — öffnen und authentifizieren die Verbindung.

Fazit

Die Funktion ftp_nb_fget() ruft Dateien von einem FTP-Server im nicht-blockierenden Modus ab und ermöglicht es dem Skript, während des Downloads weiterzuarbeiten. Führen Sie immer eine Schleife mit ftp_nb_continue() aus, solange der Zustand FTP_MOREDATA ist, und prüfen Sie die finale Konstante (FTP_FINISHED oder FTP_FAILED), bevor Sie die Datei als vollständig betrachten.

Hinweis: Die FTP-Erweiterung gilt als veraltet. Für moderne Anwendungen wird SFTP (über die ssh2-Erweiterung oder phpseclib) oder asynchrone HTTP-Clients für bessere Sicherheit und Performance bevorzugt.

Übungen

Übung
Was macht die PHP-Funktion FTP_NB_FGET?
Was macht die PHP-Funktion FTP_NB_FGET?
Was this page helpful?