Comment ajouter une fonctionnalité Asynchrone à mon projet HTML-PHP pour contourner la Lenteur du traitement ?

Eléphant du PHP | 137 Messages

22 mai 2019, 12:11

Bonjour.

J'ai fortement besoin de votre aide.
En fait, mon Code PHP ci-dessous permet de générer des Numéros depuis les informations du formulaire HTML renseigné ET de les télécharger dans un fichier .csv via le Header du Navigateur Web.
Mais le problème est que la gestion des Numéros prend TROP DE TEMPS et donc très Lente. Pour contourner ce problème, je voudrais donc ajouter à ce Code un traitement Asynchrone (en utilisant la Librairie Ajax AXIOS) de sorte à ce que la gestion des Numéros soit RAPIDE.

Code : Tout sélectionner

$now = gmdate("D, d M Y H:i:s"); header("Expires: Tue, 03 Jul 2001 06:00:00 GMT"); header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate"); header("Last-Modified: {$now} GMT"); // force download header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); $filename = "numero.csv"; // disposition / encoding on response body header("Content-Disposition: attachment;filename={$filename}"); header("Content-Transfer-Encoding: binary"); ob_start(); $df = fopen("php://output", 'w'); // pour mettre un entête sur le CSV $entetes = ['Numero']; fputcsv($df, $entetes); // numéro de base $numero = (isset($_POST['numField'])) ? $_POST['numField'] : 0; // longueur souhaité (doit être plus grande que longueur de $numéro) $longueur_total = (isset($_POST['numLength'])) ? $_POST['numLength'] : 0; // longueur utilisé en retirant la longueur de base $longueur = $longueur_total - strlen($numero); // calcule de la puissance de 10 en fonction de la longueur souhaité $max = pow(10, $longueur); // affichage du maximun de tour de la boucle // echo "<h1>$max</h1>"; for ($i = 0; $i < $max; $i++) { // différence de longueur $diff = $longueur - strlen($i); $zero = ""; for ($a = 0; $a < $diff; $a++) { // ajout des zéro devant $zero .= "0"; } // concaténation du résultat $resultat = $numero . $zero . $i; // effacement des zéro $zero = ""; // affichage du résultat $row = [$resultat]; fputcsv($df, $row); } fclose($df); echo ob_get_clean(); exit(0);
Aidez moi svp à régler ce problème de Lenteur à y ajoutant à mon projet une fonctionnalité de traitement Asynchrone en utilisant la Librairie Ajax AXIOS.

Ou si vous avez une autre quelconque suggestion à me faire, ça me fera plaisir. L'essentiel pour moi est de résoudre ce problème de Lenteur.

Merci d'avance.

Avatar du membre
Mammouth du PHP | 1609 Messages

22 mai 2019, 13:49

Salut, le traitement est trop lent, l'idée serait donc d'exécuter plusieurs scripts parallèlement qui feraient chacun une partie du traitement. Chacun générerait une partie des numéros. Une fois tous les scripts terminés, un dernier script s'occuperait de rassembler tous les numéros pour les envoyer au client.

Cela semble réalisable à base d'XHR, tu pourrais faire un premier call XHR sur un script qui déterminerait combien de scripts doivent être démarrés. Le script déterminerait combien de numéros vont devoir être créés et répartir leurs création par l'exécution de n scripts s'occupant chacun d'une plage de numéros. Les numéros pourraient être enregistrés dans des fichiers temporaires, 1 par script.
Lorsque tous les scripts auraient fini de s'exécuter, un dernier call XHR s'occuperait d'appeler un dernier script qui s'occuperait de fusionner les fichiers et de lancer le téléchargement du fichier final.

Je n'ai jamais fait ça, je n'ai donc aucune idée du gain que cela pourrait apporter, mais ça peut se tenter.

Par contre en recherchant php multithread, j'ai vu qu'il existe une librairie pthreads. J'aurai tendance à creuser de se côté pour réaliser cette tâche. Tout serait géré depuis un seul script au lieu de 3 et entièrement côté serveur alors que l'utilisation de XHR implique de développer une partie de la logique côté client et d'assurer la bonne communication entre le serveur et le client.
Développeur web depuis + de 20 ans

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

22 mai 2019, 14:02

Qu'entends-tu par "trop lent", combien de secondes ?
Quelles sont les valeurs des paramètres numField et numLength qui seront utilisés habituellement ?

Ton serveur est-il bien en PHP7 ? (beaucoup + rapide que PHP5)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 137 Messages

22 mai 2019, 14:54

Qu'entends-tu par "trop lent", combien de secondes ?
Quelles sont les valeurs des paramètres numField et numLength qui seront utilisés habituellement ?

Ton serveur est-il bien en PHP7 ? (beaucoup + rapide que PHP5)
D'abord merci à @Saian pour ta réponse. Grand merci.
Pour répondre à vous cher @rthur, je crois que je l'ai seulement essayé en local avec XAMPP Server.
Et après je l'ai aussi essayé avec Laragon qui supporte PHP7, je crois mais toujours en local. Mais c'est toujours lent.

Avatar du membre
Eléphanteau du PHP | 19 Messages

23 mai 2019, 09:14

hello l'utilisateur a t'il besoin d'avoir accès a ces données immédiatement ou pas ?
si non , je travaille justement sur du php Asynchrone en ce moment et j'utilise (sous linux) du :

Code : Tout sélectionner

exec("nohup /usr/bin/php -f ../mon_repertoire/mon_script.php ".$mon_fichier_de_parametre." > /dev/null 2>&1 &");
ce qui lance du php en mode "client" de maniere autonome. et continue l'execution de ton script principal sans plus se soucier de ce que fait le script client.
la seul subtilité est que pour passer du paramétrage ce n'est ni du get ni du post mais les arguments de ton script doivent etre séparé par des espaces. et se récuperent avec du "$argv[1]" mais qui est un peu embétant, si tu as des variables qui contiennent des espaces, a passer.
du coup je passe par un fichier temporaire de paramétrage style CSV ,que je supprime en fin d'execution de script, et je passe juste en parametre le nom du fichier de parametre.
ce qui me permet de lancer des scripts de traitement qui durent 3 a 4 mn , en "tache de fond".
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Avatar du membre
Mammouth du PHP | 1609 Messages

23 mai 2019, 12:48

Salut saveus, j'avais également pensé à cette possibilité mais elle me semble problématique quand à la détection de la fin des traitements des scripts générant les plages de numéros. Pas insurmontable mais la solution à laquelle j'ai pu penser ne me plaisait pas (par exemple chaque script créeraient un fichier en fin de traitement, le script principal lançant les commandes aurait un while avec un sleep et un test de l’existence de ces fichiers pour savoir si les traitements sont terminés afin de pourvoir lancer le merge des fichiers contenant les numéros avant de retourner le fichier mergé au client).

PS : pour les arguments avec espaces, il suffit d'encapsuler la chaine avec des ".
Développeur web depuis + de 20 ans