Précédent   Forum du club des développeurs et IT Pro > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/12/2012, 16h19   #1
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
Par défaut Exécuter un script php en background ou en parallèle

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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 19h34   #2
Théocrite
Membre confirmé
 
Homme Thomas Dutrion
Développeur Web
Inscription : février 2009
Messages : 157
Détails du profil
Informations personnelles :
Nom : Homme Thomas Dutrion
Âge : 24
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2009
Messages : 157
Points : 284
Points : 284
Bonjour,

Personnellement dans un cas comme ça j'aurais tendance à utiliser un script PHP en console (cli) en utilisant exec ou system.
Théocrite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 07h13   #3
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
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:
Note:

Si vous démarrez un programme en utilisant cette fonction et que vous voulez le laisser tourner en arrière plan, vous devez vous assurer que la sortie du programme est redirigée vers un fichier, ou un autre flux de sortie, sinon PHP attendra jusqu'à la fin de l'exécution du programme
Comment mettre un flux de sortie?
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 09h39   #4
selmouadin
Membre régulier
 
Homme Said ELMOUADIN
Développeur Web
Inscription : mai 2012
Messages : 57
Détails du profil
Informations personnelles :
Nom : Homme Said ELMOUADIN
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2012
Messages : 57
Points : 91
Points : 91
Bonjour,

essaye de declancher le traitement via Ajax
+
http://php.net/manual/en/function.ignore-user-abort.php
selmouadin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 10h02   #5
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 14h20   #6
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 299
Points : 2 889
Points : 2 889
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.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 15h36   #7
Djakisback
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 914
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 914
Points : 1 840
Points : 1 840
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
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 18h47   #8
Théocrite
Membre confirmé
 
Homme Thomas Dutrion
Développeur Web
Inscription : février 2009
Messages : 157
Détails du profil
Informations personnelles :
Nom : Homme Thomas Dutrion
Âge : 24
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2009
Messages : 157
Points : 284
Points : 284
En gros pour appeler en console sans bloquer le processus courant, j'ai utilisé la syntaxe suivante la dernière fois:

Code :
1
2
3
4
 
$cmd = escapeshellcmd('exec /usr/bin/php script.php');
$dest = '/out.txt';
popen("$cmd > $dest 2>&1 &", 'r');
Par contre ça marche que sur Linux, et pas sur tous les hébergements... Mais sinon c'est une bonne solution.
Théocrite est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2012, 08h15   #9
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
Citation:
Envoyé par transgohan Voir le message
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.
Je vais donc essayer la solution de l'Ajax "qui n'attend pas de retour".

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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 08h54   #10
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 299
Points : 2 889
Points : 2 889
Citation:
Envoyé par randriano Voir le message
Je vais donc essayer la solution de l'Ajax "qui n'attend pas de retour".

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??
Non il a raison, ce serait mieux de lancer un exec sur PHP CLI en fait.
Ainsi tu utiliseras un autre processus.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 13h18   #11
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
Citation:
Envoyé par transgohan Voir le message
Non il a raison, ce serait mieux de lancer un exec sur PHP CLI en fait.
Ainsi tu utiliseras un autre processus.
Ah, ok!

Peux-tu me montrer comment faire? Un code PHP en soutien avec redirection vers un flux de sortie.
Merci d'avance!
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 13h49   #12
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 299
Points : 2 889
Points : 2 889
Un exemple ?
Citation:
Envoyé par Théocrite Voir le message
En gros pour appeler en console sans bloquer le processus courant, j'ai utilisé la syntaxe suivante la dernière fois:

Code :
1
2
3
4
 
$cmd = escapeshellcmd('exec /usr/bin/php script.php');
$dest = '/out.txt';
popen("$cmd > $dest 2>&1 &", 'r');
Par contre ça marche que sur Linux, et pas sur tous les hébergements... Mais sinon c'est une bonne solution.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 13h55   #13
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 14h32   #14
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 299
Points : 2 889
Points : 2 889
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. ^^
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 13h36   #15
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
J'ai fait comme suit:
Code :
1
2
3
4
5
6
7
8
9
10
<?php
	$IndexPath = BASEPATH . "index.php";
	// SOUS WINDOWS > NUL
	$cmd = "php " . $IndexPath . " chargements runloading > NUL";
 
	exec($cmd);
 
	// beaucoup d'autres taches
	// .....
?>
Mais la page se recharge toujours, donc la commande ne s'exécute pas en arrière-plan comme je l’espérais. Sur le navigateur, la page a la barre de chargement qui tourne!!!
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 14h06   #16
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 299
Points : 2 889
Points : 2 889
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 :
1
2
3
4
<?php
	$IndexPath = BASEPATH . "index.php";
	// SOUS WINDOWS > NUL
	$cmd = "php " . $IndexPath . "?chargements&runloading > NUL";
Que se passe-t-il si tu appelles ton script directement (sans Ajax) ? Met-il du temps à s'exécuter ?
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 15h59   #17
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
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:
Example: Request the test.php page and send some additional data along (while still ignoring the return results).
Code js :
$.post("test.php", { name: "John", time: "2pm" } );
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 16h04   #18
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 299
Points : 2 889
Points : 2 889
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:
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.
Tes beaucoup d'autres tâches s'exécutent elles aussi en 30min / 3h ? Ou bien c'est juste des scripts web qui laisserons bien la réponse HTTP revenir dans les délais vers le navigateur ?
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 16h18   #19
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 060
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 060
Points : 865
Points : 865
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
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 16h45   #20
transgohan
Expert Confirmé
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Développeur Temps réel Embarqué
Inscription : janvier 2011
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Développeur Temps réel Embarqué

Informations forums :
Inscription : janvier 2011
Messages : 1 299
Points : 2 889
Points : 2 889
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.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h45.


 
 
 
 
Partenaires

Hébergement Web