effectuer des actions en parallèle

altergo
Invité n'ayant pas de compte PHPfrance

11 déc. 2010, 12:50

Bonjour,

J'aimerai savoir s'il est possible en PHP, comme dans des langage comme java ou c# de lancer des threads en background.
En gros, l'utilisateur upload un fichier, une page de remerciement apparait pour lui mais derriere le php continue de faire des actions prenant entre 2 et 4 minutes.
Avec mes tests, le page ne s'affiche qu'à la fin des traitements. J'aimerai donc que les traitement en php se fasse en background..

Merci de votre aide

Eléphant du PHP | 209 Messages

11 déc. 2010, 13:36

Des threads, je pense que non. Par contre, rien ne t'empêche de lancer un processus avec exec par exemple. Bien que ca ne soit pas l'usage ...

http://www.php.net/manual/fr/function.exec.php
--
Eric

altergo
Invité n'ayant pas de compte PHPfrance

11 déc. 2010, 19:17

Ah oui tu veux dire par là lancer l'execution d'un autre fichier php par la commande exec(), et dans ce cas la fonction exec() me rendrait la main sans attendre.. bien vu :)

devlop78
Invité n'ayant pas de compte PHPfrance

11 déc. 2010, 23:56

Bonjour,

J'aimerai savoir s'il est possible en PHP, comme dans des langage comme java ou c# de lancer des threads en background.
En gros, l'utilisateur upload un fichier, une page de remerciement apparait pour lui mais derriere le php continue de faire des actions prenant entre 2 et 4 minutes.
Avec mes tests, le page ne s'affiche qu'à la fin des traitements. J'aimerai donc que les traitement en php se fasse en background..

Merci de votre aide

Là tu ne parles pas vraiment de php. Tu peux toujours lancer l'upload dans un iframe caché, chargé une page de remerciement en Ajax. Bref, Php, à ma connaissance, ne possède pas de Threads, et n'étant pas évenementiel, il n'est pas non plus possible de le simuler à l'aide de timer (comme en javascript), mais le navigateur peut, lui, lancer plusieurs pages en même temps.

altergo
Invité n'ayant pas de compte PHPfrance

16 déc. 2010, 00:09

Bonjour,

J'ai essayé ce code :

Code : Tout sélectionner

exec("php5 -f ./auto/traitement.php)"
dans mon code afin que ce fichier soit appelé sans que l'utilisateur n'attende sa fin.

Mais cela ne fonctionne pas, il n'atteint jamais ce fichier, idem lorsque je met le chemin complet.
Si je regarde ce que renvoie exec() (ou system()), c'est le contenu html de la page sur lequel il est exécuté.
Je n'y comprend rien !
Par contre, si j'ouvre un shell et que j'entre "php5 monfichier.php", alors ce fichier est bien executé.

Que faire ?!

Merci de votre aide !

ViPHP
ViPHP | 5462 Messages

16 déc. 2010, 00:16

le traitement est si long que ca ?

altergo
Invité n'ayant pas de compte PHPfrance

16 déc. 2010, 00:22

Oui, plusieurs minutes, je ne veux pas que le visiteur s'en aille !
Pourquoi la fonction exec() ne fonctionne pas comme prévu ?

ViPHP
ViPHP | 5462 Messages

16 déc. 2010, 01:35

Oui, plusieurs minutes, je ne veux pas que le visiteur s'en aille !
Pourquoi la fonction exec() ne fonctionne pas comme prévu ?
exec c'est limiter php c'est pas du tout fait pour ca, dans se cas la fait un système de queue. "plusieurs minutes" en PHP c'est une éternité y'a un probleme dans ta conception, l'outils n'est pas adapté

Eléphant du PHP | 209 Messages

16 déc. 2010, 07:15

Il me semble qu'il faut rediriger la sortie
exec("php5 -f ./auto/traitement.php > /dev/null 2>&1");
(Mais bon, c'est clair que c'est pas super top... c'est quoi ce traitement ?)
--
Eric

altergo
Invité n'ayant pas de compte PHPfrance

16 déc. 2010, 09:15

Merci pour vos réponses.

Malheureusement la redirection de sortie (> /dev/null 2>&1) ne fonctionne pas mieux, le fichier n'est jamais appelé non plus.

Comment faire ?

Eléphant du PHP | 209 Messages

16 déc. 2010, 09:51

Tu as testé avec une autre commande ?
Tu as testé avec les droits du serveur web ?
--
Eric

ViPHP
ViPHP | 5462 Messages

16 déc. 2010, 10:57

essaye toujours avec un popen mais bon...

Petit nouveau ! | 4 Messages

16 déc. 2010, 16:03

il faut te deconnecter du processus avec nohup
exec("nohup *command* 1>/dev/null/ 2>&1 &");
http://www.php.net/manual/fr/function.exec.php#11800
Je pense que ça devrait résoudre ton problème.

altergo
Invité n'ayant pas de compte PHPfrance

16 déc. 2010, 22:05

Bonsoir,

Merci mais malheureusement aucune de ces fonctions (nohup et popen) ne fonctionne pour mon cas.

A titre d'exemple, quand je lance en ligne de commande pur :

Code : Tout sélectionner

#nohup php5 traitement.php
le fichier traitement.php est bien atteint, et j'ai meme un nouveau fichier nohup.out qui contient la sortie de la commande.

Quand je lance en php
exec("nohup php5 traitement.php");
Rien ne se passe, pas d'accès à traitement.php, et pas non plus de fichier nohup.out ! :roll: #-o

Serais-ce à cause de restrictions sur mon serveur (mutualisé) ?

Eléphant du PHP | 209 Messages

17 déc. 2010, 07:53

Est-ce que tu as essayé exec sur une commande (genre "date") afin de récupérer la sortie pour valider que tu pouvais utiliser exec ?
--
Eric