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):
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
ftp_stream | Ja | Der Verbindungsbezeichner, der von ftp_connect() zurückgegeben wird. |
handle | Ja | Ein geöffneter lokaler Datei-Pointer (von fopen()), in den die Daten geschrieben werden. |
remote_file | Ja | Der Pfad zur Datei auf dem FTP-Server. |
mode | Ja (PHP < 7.3) | Übertragungsmodus: FTP_ASCII oder FTP_BINARY. Optional und standardmäßig FTP_BINARY seit PHP 7.3. |
resumepos | Nein | Byte-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 Sieftp_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 Sieftp_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 (keinfopen()erforderlich).ftp_nb_continue()— treibt die vonftp_nb_fget()gestartete Übertragung voran.ftp_nb_fput()— das nicht-blockierende Gegenstück zum Hochladen.ftp_connect()undftp_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 oderphpseclib) oder asynchrone HTTP-Clients für bessere Sicherheit und Performance bevorzugt.