Progresse barre

Par cid5420, il y a 9 ans


Bonjour,

J'aimerais utiliser une progress barre qui indique la progression de l'execution d'un script php (plutôt long).

Seulement je ne sais pas comment m'y prendre, pouvez vous me conseiller ?

11 réponses

cid5420, il y a 9 ans

Ok oui très bon tuto mais comment l'adapter à ce que je veux faire ? c'est à dire dans une méthode où j'ai 10 requêtes ?

Lartak, il y a 9 ans

Bonjour.

dans une méthode où j'ai 10 requêtes

Tu veux dire 10 requêtes SQL ?
Si c'est le cas, ça fait un peu trop dix requêtes SQL pour une seule méthode, tu devrais penser à revoir ta méthode pour diminuer le nombre de requêtes SQL qu'elle effectue.

cid5420, il y a 9 ans

J'exagere un peut mais il se trouve que je dois faire une opération un peut longue, (calcule + requete sql)

yanis-git, il y a 9 ans

Montre nous ton script, en l'état nous ne pouvons t'aider.

cid5420, il y a 9 ans

Bon bah voila ^^

public function calcul() { $date = str_replace('-', '/', str_replace(' ', '', $_GET['date'])); $n = 0; //POUR CHAQUE LIGNE PPD DU MOIS $date $ppd = $this->FtthPpd->lastPPDMois($date); foreach($ppd as $p){ $optimum = $this->FtthOptimum->find($p->CodeIMB); if(!empty($p->type)){ $type = $p->type; }else{ $tp = $this->FtthBpu->TypeBpu(str_replace(' ', '', $p->CodeArticle)); $type = $tp->type; } //RECHERCHE INFO OPTIMUM CAPECOM $oc = $this->FtthOptimumCapecom->find($p->CodeIMB); //SI PAS ZONE PAPM if($p->CodeArticle != 'CEM42'){ //SOCIETE ATTACHE A L'IMB DE LA PPD if($type === 'etude'){ $sos = $oc->societe_etude_id; }elseif($type === 'travaux'){ $sos = $oc->societe_travaux_id; } $s = $this->FtthSociete->find($sos); $bpu = $this->FtthBpu->findBpu($s->id, $type, $optimum->nb_logements, $oc->fibre_id, $p->CodeArticle); // SI j'ai un attachement if(!empty($sos)){ if(!empty($bpu)){ $prix_t = $bpu->prix*$optimum->nb_logements; }else{ $prix_t = 0; } }else{ $prix_t = 0; } }else{ //IDENTIFICATION IMB PARENT DE LA ZONE PAPM $dossier = $this->FtthOptimum->lastDossierByPAPM($optimum->id_pa, $optimum->id_pm); $imb = $dossier[0]->dossier; //IDENTIFICATION TOUT IMB DE LA ZONE $imbs = $this->FtthOptimum->lastDossierByPAPM($optimum->id_pa, $optimum->id_pm); //INFO TABLE ZAPAPM if($optimum->id_pa != ''){ $key = $optimum->id_pa.'_'.$optimum->id_pm; }else{ $key = $optimum->id_pm; } $z = $this->FtthZapapm->findByKey($key); if($p->type === 'travaux'){ $s = $z->ftth_societe_travaux_id; }elseif($p->type === 'etude'){ $s = $z->ftth_societe_etude_id; } if(!empty($s)){ $sos = $this->FtthSociete->find($s); //RECHERCHE BPU $bpu = $this->FtthBpu->bpuza($s, 'CEM42', $p->type); if($bpu){ $prix_t = $bpu->prix*$optimum->nb_logements; }else{ $prix_t = 0; } }else{ $prix_t = 0; } } $n = $n+$prix_t; } $calcule = $this->FtthPpdCalcule->findByDate($date); if($calcule){ $this->FtthPpdCalcule->update($date, [ 'prix' => $_GET['prix'], 'prix_s' => $n, 'prix_d' => round(intval($_GET['prix'])-$n, 2) ]); }else{ $this->FtthPpdCalcule->create([ 'prix' => $_GET['prix'], 'prix_s' => $n, 'prix_d' => round(intval($_GET['prix'])-$n, 2), 'date_debut' => $date ]); } return $this->index(); }
Chevre, il y a 9 ans

Je pense qu'il serait possible que tu incrémentes à chaque fois que l'éxécution d'une requête est finie ainsi tu pourrais faire une barre de progression.

cid5420, il y a 9 ans

ok du coup comment je renvoie l'incrémentation vers js ?

CRIDIP-SWD, il y a 9 ans

En utilisant ajax

yanis-git, il y a 9 ans

Ou plutôt les websokets pour éviter les multitudes de requête ajax qui retourne la même réponse. Le problème est le suivant :
Ajax méthode :
client : hei quel est ton état ?
serveur: status => 1
client (n time après) : Hei quel est ton état ?
serveur: status => 1
[...]
Et ainsi de suite.

la philosophie websocket :
Serveur : Hei j'ai changé d'état, je suis status 1
Client : j'update mon UI
serveur quand il change d'état : Hei j'ai changé d'état, je suis status 2

Ici c'est le serveur qui notifie le client qu'il a changé, et pas le client qui intéroge à interval régulier si le serveur a changé d'état.

Huggy, il y a 9 ans

Il faudrait que le serveur renvoie les états en mode "chunk" (rajouter le header 'Transfer-Encoding: chunked' côté serveur).
En mode chunk, la connection entre le serveur et le navigateur reste ouverte tant qu'il reste des chunk à envoyer
En js ça donne

var xhr = new XMLHttpRequest() xhr.open("GET", "/test/chunked", true) xhr.onprogress = function () { console.log("PROGRESS:", xhr.responseText) } xhr.send()

voir l'article ici
Côté php il suffit de flusher l'état après chaque requête