Position actuelle: Accueil> Derniers articles> FTP_NB_CONTINUe reste coincé? Vous apprendre quelques astuces pour éviter les problèmes de blocage et de délai d'expiration

FTP_NB_CONTINUe reste coincé? Vous apprendre quelques astuces pour éviter les problèmes de blocage et de délai d'expiration

gitbox 2025-06-09

Lorsque vous utilisez la fonction de fonctionnement FTP non bloquante de PHP FTP_NB_CONTINUE () , de nombreux développeurs rencontreront un problème difficile: le programme semble être "coincé", ni renvoyer une erreur ni continuer à s'exécuter. C'est souvent le cas parce que la session FTP est dans un état d'attente inattendu. Cet article introduira en détail les causes courantes de FTP_NB_Continue () bloquées et fournira plusieurs solutions efficaces pour vous aider à éviter les problèmes de blocage et de délai d'attente.

Qu'est-ce que FTP_NB_CONTINUE?

FTP_NB_CONTINUE () est utilisé avec des fonctions de transmission non bloquantes (telles que ftp_nb_get () et ftp_nb_put () ). Sa fonction est de poursuivre une opération FTP inachevée. L'avantage de la transmission non bloquant est qu'une autre logique peut être poursuivie pour être traitée en attendant que la transmission soit terminée, améliorant ainsi l'efficacité de la réponse du programme.

Un processus de téléchargement typique non bloquant est le suivant:

<code> $ ftp = ftp_connect ('gitbox.net'); ftp_login ($ ftp, «nom d'utilisateur», «mot de passe»); $ ret = ftp_nb_get ($ ftp, 'local_file.txt', 'rote_file.txt', ftp_binary);

while ($ ret == ftp_moredata) {
// peut effectuer d'autres tâches
do_something_else ();

 // Continuer à transférer
$ret = ftp_nb_continue($ftp);

}
</code>

Ça a l'air très simple, non? Mais lorsque vous l'utilisez réellement, beaucoup de gens sont "coincés" par ce cycle.

Raisons courantes pour coincé

1. Le serveur FTP est lent ou ne répond pas

Certains serveurs FTP retardent la réponse dans certains états, surtout si vous demandez des données trop importantes ou si vous avez de mauvaises conditions de réseau. Cela fait que FTP_NB_CONTINUE () reste dans l'état FTP_MOREDATA et ne se termine jamais.

Solution:

  • Définissez un délai d'expiration raisonnable:

    <code> ftp_set_option ($ ftp, ftp_timeout_sec, 30); </code>
  • Utilisez stream_set_timeout () pour obtenir un contrôle granulaire plus fin (besoin d'obtenir le flux sous-jacent de FTP).

2. Le cycle mort n'a pas été retardé et l'occupation du processeur a grimpé en flèche

De nombreux développeurs oublient d'ajouter des retards à la boucle while lors de la rédaction de boucles non bloquantes, ce qui fait monter l'utilisation du processeur, et le serveur FTP n'a pas non plus le temps de répondre aux demandes.

Solution:

<code> while ($ ret == ftp_moredata) {do_something_else (); usleep (100000); // retard 100ms $ ret = ftp_nb_continue ($ ftp); } </code>

3. Le fichier a été transféré, mais le statut n'a pas été mis à jour

Certains serveurs FTP ne renvoient pas le code d'état correctement une fois la transmission terminée, et FTP_NB_CONTINUE () ne peut pas déterminer que la transmission a été terminée.

Solution:

  • Vérifiez si la taille du fichier local répond aux attentes;

  • Définissez un nombre maximum de temps de réessayer:

    <code> $ maxtries = 100; $ essais = 0;

    while ($ ret == ftp_moredata && $ essais <$ maxtries) {
    usleep (100000);
    $ ret = ftp_nb_continue ($ ftp);
    $ essaie ++;
    }

    if ($ essaies == $ maxtries) {
    Jetez une nouvelle exception («FTP Transmission Timeout»);
    }
    </code>

4. Erreur de configuration du mode passif / actif FTP

Différents serveurs ne prennent pas en charge les modes actifs (port) et passifs (PASV), et les paramètres incorrects peuvent entraîner l'établissement de connexion, mais les données ne peuvent pas être transférées correctement.

Solution:

<code> ftp_pasv ($ ftp, true); // Activer le mode passif </code>

Essayez de basculer entre le mode actif / passif et voyez lequel est le plus compatible avec votre service FTP.

Résumé des meilleures pratiques

  • Lorsque vous utilisez le mode non bloquant, assurez-vous de concevoir un mécanisme de sortie;

  • Assurer que des retards raisonnables sont ajoutés au cycle;

  • Définir le délai d'expiration et le nombre maximum de tentatives;

  • Si vous rencontrez une longue période de décalage, essayez de changer de mode FTP;

  • N'oubliez pas de publier des ressources:

    <code> ftp_close ($ ftp); </code>

Conclusion

FTP_NB_CONTINUE () peut en effet améliorer la flexibilité du fonctionnement FTP, mais il est également facile de rester coincé. En maîtrisant les compétences ci-dessus, vous pouvez éviter le blocage, le brouillage et l'utilisation excessive du processeur dans le développement réel, ce qui rend votre programme FTP PHP plus stable et plus efficace. Si vous rencontrez des situations similaires, vous pourriez aussi bien les vérifier un par un et trouver la cause profonde et prescrire le bon médicament.