Page 1 sur 1

Suivi du chargement avec ftp_nb_put

Posté : 05 juin 2006, 15:04
par yoxos
Bonjour à tous,

Je fais quelques essais avec les nouvelles fonctions ftp telles que ftp_nb_put et si j'ai bien compris leur utilité principale, c'est le fait qu'elles soient asynchrones et non bloquantes, donc qu'à priori l'on devrait pouvoir afficher une progress barre. Mais alors voilà, je fais un test en me basant sur la doc PHP pour afficher des petits points pendant le chargement :
<?php

///////////////////////////////////////////////////////////////////////le fichier à charger

if(file_exists("fichier.mp3")){
$fichier_local = "fichier.mp3";
}else{die( "le fichier n'existe pas");}

///////////////////////////////////////////////////////////////////////connection

$serveur_ftp =  "mon serveur";
$ma_connec = ftp_connect($serveur_ftp);
$utilisateur_ftp="mon_login";
$pass_ftp="mon_mot_de_passe";
  
$resultat_connection = ftp_login($ma_connec, $utilisateur_ftp, $pass_ftp);
ftp_pasv($ma_connec, true);

// Vérification de la connexion
if ((!$ma_connec) || (!$resultat_connection)) { 
        echo utf8_encode("La connexion FTP a échoué !");
        exit; 
    } else {
        echo utf8_encode("<br><hr>Connexion au serveur $serveur_ftp, pour l'utilisateur $utilisateur_ftp<br><hr>");
    }

//////////////////////////////////////////////////// le ftp_nb_put

 $fichier_distant="/web/test/fichier.mp3";

$ret = ftp_nb_put($ma_connec, $fichier_distant, $fichier_local, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
   
 ////////$temp = ftp_size($ma_connec, $fichier_distant);   echo "." . $temp .  "<br>";///// ceci ne marche manifestemment pas du tout non plus...
   echo "." ;

   // Continue le téléchargement...
   $ret = ftp_nb_continue ($ma_connec);
}
if ($ret != FTP_FINISHED) {
   echo utf8_encode("Il y a eu une erreur lors du chargement...");
   exit(1);
}else{echo utf8_encode("fichier deposé");}

////////////////////////////////////////////////////////////////////////////////////
?>
Bon alors bien sûr le fichier se charge correctement mais les points et tout les autres "echo" ne s'affichent qu'à la fin du chargement... durant toute la durée de ce dernier, le browser affiche en connexion avec "mon_serveur"...

Voilà, merci de votre indulgence face à mon ignorance... mais, dites-moi, ai-je bien compris la particularité de cette fonction où l'applique-je mal?

Merci d'avance pour l'éclairage de ma bien sombre lanterne....

Posté : 05 juin 2006, 16:47
par goeb
salut,
je pense que quand le script PHP écrit un point, le serveur web ne l'envoie pas tout de suite au client (le navigateur web), mais "bufferise", c'est-à-dire qu'il attend qu'il y en ait suffisamment pour envoyer.

donc tu reçois tous les points d'un coup.
et je sais pas comment changer ça. essaye peut-être d'envoyer 500 espaces et un point.

Posté : 05 juin 2006, 18:07
par Lorenzo
exact, pour palier ce probleme tu dois a chaque flush() (donc echo) envoyer 255 caracteres ....
suffit de rajouter un str_repeat(' ', 255); a concatener a tes données ...

mais le mieux :
$stA_Envoyer = "la chaine a afficher";
echo $stA_Envoyer.(str_repeat(' ', 255-strLen($stA_Envoyer)));

Posté : 05 juin 2006, 18:08
par yoxos
Merci goeb,

Effectivement, en ajoutant 500 espaces, il ne bufférise plus... par contre si je ne met pas de balise html dans mon echo ".", le navigateur n'affiche rien... bizarre

Code : Tout sélectionner

echo $espace . "<b> . </b>";
par contre, n'y a-t-il pas un moyen de suivre le poids de ce qui est uploadé sur le serveur?
par ex: (qui ne marche pas, mais pas du tout...:cry:)

Code : Tout sélectionner

while ($ret == FTP_MOREDATA) { $temp = ftp_size($ma_connec, $file); echo $espace . "<b> ." . $temp . "</b>" ; // Continue le téléchargement... $ret = ftp_nb_continue ($ma_connec); }
Bien que cela me semble très délicat...

Merci d'avoir la patience de me lire :roll:

Posté : 06 juin 2006, 16:17
par goeb
une idée (mais je sais pas si ça peut marcher) serait de faire en parallèle une autre connexion ftp, pour lire avec ftp_size...

mais certains serveurs FTP n'acceptent pas 2 connexions simultanées du même utilisateur.
et je sais pas non plus si PHP peut en gérer 2 simultanément.


une autre idée serait d'utiliser la fonction ftp_nb_fput qui lit un descripteur de fichier, et la fonction ftell sur ce même descripteur de fichier qui dit à quel position en est la lecture.
mais si le PHP lit tout le fichier d'un coup et envoie par FTP par petits bouts, ça ne va pas t'intéresser...

Posté : 08 juin 2006, 21:21
par Invité
exact, pour palier ce probleme tu dois a chaque flush() (donc echo) envoyer 255 caracteres ....
suffit de rajouter un str_repeat(' ', 255); a concatener a tes données ...

mais le mieux :
$stA_Envoyer = "la chaine a afficher";
echo $stA_Envoyer.(str_repeat(' ', 255-strLen($stA_Envoyer)));
Pfiou, je n'avais pas vu ce post malin qui c'était glissé comme ça là au milieu.. très élégant!

Merci