ftp_nb_fget()
La fonction ftp_nb_fget() est une fonction PHP intégrée qui récupère un fichier du serveur FTP et l'écrit dans un fichier local en mode non bloquant.
Comprendre la fonction PHP ftp_nb_fget()
La fonction ftp_nb_fget() est une fonction PHP intégrée qui récupère un fichier depuis un serveur FTP et l'écrit dans un fichier local en mode non bloquant. Cet article propose un guide complet sur son utilisation dans vos projets PHP.
Qu'est-ce que ftp_nb_fget() ?
La fonction ftp_nb_fget() récupère un fichier distant et l'écrit dans un pointeur de fichier local déjà ouvert sans bloquer le script. Non bloquant signifie que l'appel retourne immédiatement au lieu de s'interrompre jusqu'à ce que le fichier entier soit transféré, ce qui permet au script de continuer à effectuer d'autres tâches pendant que le téléchargement s'exécute en arrière-plan.
Elle prend quatre paramètres (trois obligatoires, un optionnel) :
| Paramètre | Obligatoire | Description |
|---|---|---|
ftp_stream | Oui | L'identifiant de connexion retourné par ftp_connect(). |
handle | Oui | Un pointeur de fichier local ouvert (via fopen()) dans lequel les données sont écrites. |
remote_file | Oui | Le chemin vers le fichier sur le serveur FTP. |
mode | Oui (PHP < 7.3) | Mode de transfert : FTP_ASCII ou FTP_BINARY. Optionnel et vaut FTP_BINARY par défaut depuis PHP 7.3. |
resumepos | Non | Décalage en octets dans le fichier distant à partir duquel reprendre. Vaut 0 par défaut. |
La fonction retourne l'une des trois constantes suivantes :
FTP_FINISHED— le transfert s'est terminé avec succès.FTP_MOREDATA— le transfert est toujours en cours ; appelezftp_nb_continue()pour continuer.FTP_FAILED— une erreur s'est produite.
Bloquant vs. non bloquant : l'équivalent bloquant est
ftp_fget(), qui retourne uniquement une fois le fichier entièrement transféré. Préférezftp_nb_fget()lorsque vous souhaitez afficher la progression, effectuer d'autres tâches ou transférer plusieurs fichiers de façon quasi-parallèle.
Syntaxe de ftp_nb_fget()
La syntaxe de la fonction ftp_nb_fget() est la suivante :
Syntaxe de ftp_nb_fget()
int ftp_nb_fget ( resource $ftp_stream , resource $handle , string $remote_file , int $mode [, int $resumepos = 0 ] )Utilisez FTP_BINARY pour tout fichier non textuel (images, archives, exécutables) afin que les octets soient copiés tels quels ; FTP_ASCII traduit les fins de ligne et ne doit être utilisé que pour les fichiers en texte brut. Le paramètre resumepos est pratique pour reprendre un téléchargement partiel : passez la taille du fichier local afin que le transfert reprenne là où il s'est arrêté plutôt que de recommencer depuis le début.
Utilisation de ftp_nb_fget()
Pour utiliser la fonction ftp_nb_fget(), vous devez d'abord établir une connexion au serveur FTP à l'aide de la fonction ftp_connect(). Voici un exemple :
Utilisation de 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);
?>Dans cet exemple, nous établissons une connexion au serveur FTP à l'aide de ftp_connect(). Nous nous connectons ensuite avec ftp_login(). Nous ouvrons un fichier en écriture à l'aide de fopen() et lançons une opération FTP asynchrone avec ftp_nb_fget(). Nous poursuivons l'opération à l'aide de ftp_nb_continue() dans une boucle while qui vérifie la constante FTP_MOREDATA. Enfin, nous contrôlons le résultat et fermons le fichier ainsi que la connexion FTP.
Gestion des erreurs dans ftp_nb_fget()
Il est important de gérer correctement les erreurs lors de l'utilisation de la fonction ftp_nb_fget(). La fonction et ftp_nb_continue() retournent des constantes d'état plutôt que de simples booléens. Voici un exemple illustrant la gestion des erreurs et la vérification des états de transfert :
Gestion des erreurs dans 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);
?>Fonctions associées
ftp_fget()— la version bloquante qui télécharge vers un pointeur de fichier ouvert.ftp_nb_get()— téléchargement non bloquant directement vers un chemin local (sansfopen()).ftp_nb_continue()— pilote le transfert démarré parftp_nb_fget().ftp_nb_fput()— l'équivalent non bloquant pour l'envoi de fichiers.ftp_connect()etftp_login()— ouvrent et authentifient la connexion.
Conclusion
La fonction ftp_nb_fget() récupère des fichiers depuis un serveur FTP en mode non bloquant, permettant au script de continuer d'autres tâches pendant le téléchargement. Bouclée toujours sur ftp_nb_continue() tant que l'état est FTP_MOREDATA, et vérifiez la constante finale (FTP_FINISHED ou FTP_FAILED) avant de considérer le fichier comme complet.
Remarque : L'extension FTP est considérée comme obsolète. Pour les applications modernes, privilégiez SFTP (via l'extension
ssh2ouphpseclib) ou les clients HTTP asynchrones pour une meilleure sécurité et de meilleures performances.