[RESOLU] Problème Ajax & Php : lancer plusieurs requêtes simultanées

Eléphanteau du PHP | 12 Messages

27 juil. 2012, 16:09

Bonjour,

Après avoir consulté plusieurs forum, mon problème ne trouve pas de solutions.
Je dispose d'une page qui contient un formulaire. Lors de la soumission de celui, je ne recharge pas la page mais appelle une fonction javascript (ma_fonction ()) qui utilise jQuery ajax qui lance la soumission du formulaire (mon_traitement.php). ma_fonction() lance également une requête ajax qui lance une page php (async_check.php) qui permettrait de vérifier le bon fonctionnement de mon_traitement.php.

Il se trouve que mon_traitement.php et async_check.php sont bel et bien lancé en même temps, mais async_check.php ne retourne un résultat qu'après que mon_traitement.php n'ai retourné son résultat.

J'ai essayé pour tester de lancer plusieurs fois la même URL php en ajax
Exemple :
function OnSubmit(data){
$.ajax({async : true, type: $(this).attr("method"), url: $(this).attr("action") });
$.ajax({async : true, type: $(this).attr("method"), url: $(this).attr("action") });
$.ajax({async : true, type: $(this).attr("method"), url: $(this).attr("action") });
}
Avec firebug, je constate que les 3 URLs sont bien lancées en même temps mais retournent leur réponse les une après les autres. Donc si cette URL met 5 secondes à s'exécuter, les 3 requêtes mettent 15 secondes à s'exécuter.

Mon souhait serait de pouvoir consulter en temps réel un traitement de donnée. Pour ce faire, mon_traitement.php écrit dans un fichier et async_check.php est supposé le lire pendant le traitement... sauf que async_check.php ne retourne une réponse qu'à la fin de mon_traitement.php (ce qui est totalement useless).

Auriez-vous des solutions ou d'autres pistes ?
Merci d'avance,
Gatt

ViPHP
xTG
ViPHP | 7331 Messages

27 juil. 2012, 17:36

Le problème est donc côté serveur.
T'as quoi dans tes scripts PHP ?
Un accès à verrou ? Ils accèdent tous à une base de données ? Au même fichier ?

Eléphanteau du PHP | 12 Messages

27 juil. 2012, 17:52

C'est le framework Zend

mon_traitement est lancé par ma_class->processAction

Code : Tout sélectionner

class ma_class { protected function set_status_csv ($infos=array()) { $id_personne=007; if (($handle = fopen("/tmp/status_".$id_personne.".csv", "w+")) !== FALSE) { foreach ($infos as $key=>$value) { fputcsv($handle, array($key, $value), ';'); } fclose($handle); } } public function get_status_csv () { $infos=array(); $id_personne=007; if (($handle = fopen("/tmp/status_".$id_personne.".csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { if (count($data)==2) $infos[$data[0]] = $data[1]; } fclose($handle); } return $infos; } public function processAction ($params=array(), $multiprocess=false) { $return_process = array(); if ($multiprocess) { $stack_process = array(); foreach ($params as $key => $exec_process) { if (substr($key, 0, 13)=='multiActionBC') { //$stack_process[] = str_replace('multiActionBC_', '',$key); $stack_process[] = $exec_process; } } if (count($stack_process)) { $this->set_status_csv (array('nb_multiprocess'=>count($stack_process), 'cur_multiprocess'=>0, 'percent_multiprocess'=>0)); $params_temp=$params; for ($i=0; $i<count($stack_process); $i++) { $params_temp['actionBC'] = $stack_process[$i]; $params_temp['nodename'] = 'MULTIPROCESS'; $this->processAction($params_temp); $this->set_status_csv ( array('nb_multiprocess'=>count($stack_process), 'cur_multiprocess'=>$i+1, 'percent_multiprocess'=>((($i+1)*100)/(count($stack_process))) )); } } } //Traitement unitaire //Fin Traitement unitaire } }
Côté HTML :

Code : Tout sélectionner

<script> var timer=true; function timer_progressbar(result) { console.log(result); if (timer) { jQuery.ajax({ url: 'async_check.php', success: timer_progressbar }); $( "#tb-url" ).dialog({ modal: true, title: "Chargement" }); } } function OnSubmit(data){ timer=true; timer_progressbar(); $.ajax({ type: $(this).attr("method"), url: $(this).attr("action"), data: $(this).serialize(), success: OnSuccess }); return false; } function OnSuccess(result){ //TODO : redirection $( "#tb-url" ).dialog({ modal: true, title: "OK" }); timer=false; } </script>
Et enfin async_check.php

Code : Tout sélectionner

ma_class->get_status_csv();

ViPHP
xTG
ViPHP | 7331 Messages

27 juil. 2012, 18:37

Tu fais plein d'ouvertures/fermetures du même fichier.
Si tes trois requêtes Ajax appellent ce genre de traitement faut pas chercher plus loin...

Il y a moyen d'optimiser tout ça, déjà au lieu de faire un fopen pour chaque itération d'une boucle, ouvres en début et fermes en fin !

Eléphanteau du PHP | 12 Messages

27 juil. 2012, 19:14

Je vais essayer de sortir tout ça de Zend et faire un test avec fichiers séparés en local.

Eléphanteau du PHP | 12 Messages

03 août 2012, 10:27

Pour ceux que ça intéresse, j'ai résolu le problème en ne faisant qu'un appel ajax sur une URL qui lance le traitement via un
exec("wget $mon_URL -b");

J'ai abandonné l'idée d'écrire dans un fichier, je passe par la base de donné dans laquelle je stocke les processus en cours de traitement.
Cette méthode me permet de suivre l’exécution d'un script php et de communiquer ces infos via une barre de progression.

Je pense que t'avais totalement raison sur le problème d'ouvertures/fermetures, merci pour ton aide ;)

voilà :)