|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Bonjour,
J'ai développé une application web qui traite de gros fichiers Excel. Le terme que l'on utiliser c'est "ventiler", "ventilation" fichier Excel. Le souci c'est qu'une opération de ventilation prenne des heures (de 30 mn à 3 heures), c'est possible en utilisant set_time_limit(0) dans le script. Le but c'est que le lancement de ce script ne bloque pas l'utilisation de l'interface graphique de l'application, ce qui est le cas actuellement car il faut attendre que le fichier php soit totalement exécuté avant que le site soit utilisable. Le but est donc: quand on clique sur le bouton "ventiler", le script correspondant soit exécuté séparément et l'interface graphique demeure utilisable pour d'autres taches. Oui, je sais, multithread sous PHP, ça n'existe pas. Mais quelle serait la solution équivalente? merci d'avance!
__________________
randriano.dvp.com |
|
|
00
|
|
|
#3 | |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Merci pour ces fonctions
mais ma question c'est est-ce que ces fonctions laissent la commande s'exécuter en arrière-plan ou bien il faut attendre que la commande finisse pour passer à l'instruction suivante? J'ai lu une note du manuel PHP: Citation:
__________________
randriano.dvp.com |
|
|
|
00
|
|
|
#4 |
|
Membre régulier
![]() Said ELMOUADINDéveloppeur Web Inscription : mai 2012 Messages : 57 ![]() |
Bonjour,
essaye de declancher le traitement via Ajax + http://php.net/manual/en/function.ignore-user-abort.php |
|
|
00
|
|
|
#5 |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Ajax ou pas, cela ne fera-t-il pas planter le navigateur si l'ajax ne se terminera qu'au bout de 30 mn à 3h la durée d'exécution du script php.
La fonction ignore_user_abort() est intéressant mais je ne crois pas que c'est ce qui me convient dans mon problème non?
__________________
randriano.dvp.com |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
Un flux de sortie pour une commande linux c'est ainsi :
Tu rediriges ainsi le flux vers un fichier qui ne conserve rien en mémoire (mais prévu pour). Le plus simple reste d'effectuer une requête Ajax pour lancer le script sans attendre de retour. Dans ton script tu peux utiliser une variable de session pour indiquer l'avancement. Et tu peux donc faire un second script renvoyant la valeur de cette variable appelé via une requête Ajax périodique. Ainsi pas de souci.
__________________
|
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 914 ![]() |
Juste pour attirer l'attention sur le fait qu'Ajax en asynchrone fera bosser le même processus que celui qui sert toutes les pages, ce qui peut tendre vers un goulot d'étranglement dans le cas de multiples traitements lourds simultanés, contrairement à l'exécution via ligne de commande. Dans le cas où un seul traitement à la fois est permis, il semblerait judicieux d'utiliser un flag commun à tous les utilisateurs.
__________________
Vive les roues en pierre |
|
|
00
|
|
|
#8 | ||
|
Membre confirmé
![]() Thomas DutrionDéveloppeur Web Inscription : février 2009 Messages : 157 ![]() |
En gros pour appeler en console sans bloquer le processus courant, j'ai utilisé la syntaxe suivante la dernière fois:
Code :
|
||
|
10
|
|
|
#9 | |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Citation:
Djakisback > Pour l'Ajax périodique pour suivre l'avancement, je crois qu'il n'y aura pas de problème d'étranglement car c'est ce que fais les sites plein d'Ajax comme GMail, Facebook, etc. non??
__________________
randriano.dvp.com |
|
|
|
00
|
|
|
#10 | |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
Citation:
Ainsi tu utiliseras un autre processus.
__________________
|
|
|
|
00
|
|
|
#11 | |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Citation:
Peux-tu me montrer comment faire? Un code PHP en soutien avec redirection vers un flux de sortie. Merci d'avance!
__________________
randriano.dvp.com |
|
|
|
00
|
|
|
#12 | |||
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
Un exemple ?
Citation:
__________________
|
|||
|
|
00
|
|
|
#13 |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Comme l'a dit Théocrite, cela ne marche que sur Linux et de plus pas sur tous les hébergements. Je suis sous Windows!
__________________
randriano.dvp.com |
|
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
exec : http://fr2.php.net/manual/fr/function.exec.php
ou bien en plus contrôlé : http://fr2.php.net/manual/fr/function.proc-open.php Quand à la redirection de flux sous windows c'est comme sous unix pour la sortie normale à savoir : cmd > fichier Quand à ne pas fonctionner sur tous les hébergeurs je pense que c'est davantage du à un problème de droit qu'autre chose. Sur un hébergement mutualisé tu peux par exemple oublier le lancement de processus. ^^
__________________
|
|
|
00
|
|
|
#15 | ||
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
J'ai fait comme suit:
Code :
__________________
randriano.dvp.com |
||
|
|
00
|
|
|
#16 | ||
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
Et si tu enlèves tes "beaucoups d'autres tâches" ?
De plus je reste assez sceptique concernant les arguments se trouvant après ton index.php Ce sont des arguments que tu souhaites passer à ton script ? Code php :
__________________
|
||
|
|
00
|
|
|
#17 | |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Si c'est ça le but, on n'attends pas que la commande exécutée avec exec() soit finie, il faut passer tout de suite à "beaucoup d'autres tâches". La commande peut mettre 30 mn à 3 heures à s'exécuter.
Ne t'inquiète pas, il n'y a pas de problème avec la syntaxe de la commande, c'est du CodeIgniter, ces arguments sont corrects. Si je lance exec() en Ajax avec la fonction post() de JQuery, bien que l'indication de chargement de l'onglet Firefox ne s'affiche pas, en regardant avec Firefox dans le console, il y a un script Ajax qui tourne sans arrêt malgré le fait que je lance bien un Ajax sans attente de retour: Citation:
Code js :
$.post("test.php", { name: "John", time: "2pm" } );
__________________
randriano.dvp.com |
|
|
|
00
|
|
|
#18 | |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
Cela me semblait juste bizarre de voir de la réécriture d'url à base d'espace.
Pour vérifier que ce n'est pas le code Ajax qui est incriminé tentes de lancer le code PHP directement et ce sans ton code des autres tâches. Si tu te prends un timeout (si à 30sec dans ton php.ini) ou bien qu'il charge indéfiniment c'est que exec attend malgré la redirection du flux la fin de la commande. Mais sinon je ne comprends pas la remarque : Citation:
__________________
|
|
|
|
00
|
|
|
#19 |
|
Membre émérite
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 1 060 ![]() |
Non, ces autres tâches ne durent pas aussi longtemps! Pour info, mes time_out sont déjà élevés, de plus j'utilise set_limit_time(0) !
Vu qu'utiliser Ajax ne serait pas performant car utilisant le même processus que la page en cours et que se passerait-il si on ferme la page, comment faire pour ne pas avoir la page en chargement quand on clique sur le bouton qui lancera exec() ??
__________________
randriano.dvp.com |
|
|
00
|
|
|
#20 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 299 ![]() |
Si ton script PHP appelé via Ajax se termine tu ne devrai pas avoir cet icone de chargement (malgré l'exécution parallèle du exec).
C'est pour cela que je t'ai demandé si le script se terminai bien lorsque tu l'appelais dans un onglet. Sinon Ajax utilise bien le même processus, mais pas PHP CLI appelé via ton exec.
__________________
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com