Suivi du chargement avec ftp_nb_put

Eléphanteau du PHP | 16 Messages

05 juin 2006, 15:04

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....

Eléphant du PHP | 413 Messages

05 juin 2006, 16:47

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.
--
Goeb

Eléphant du PHP | 254 Messages

05 juin 2006, 18:07

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)));
Modifié en dernier par Lorenzo le 05 juin 2006, 18:08, modifié 1 fois.

Eléphanteau du PHP | 16 Messages

05 juin 2006, 18:08

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:

Eléphant du PHP | 413 Messages

06 juin 2006, 16:17

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...
--
Goeb

Invité
Invité n'ayant pas de compte PHPfrance

08 juin 2006, 21:21

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