Bonjour,
sauriez-vous comment lancer, dans un script PHP, lancer un processus en tâche de fond sans que le script n'attende la terminaison du processus lancé?
J'ai rien trouvé dans les cours et tutoriels PHP.
Merci d'avance.
Bonjour,
sauriez-vous comment lancer, dans un script PHP, lancer un processus en tâche de fond sans que le script n'attende la terminaison du processus lancé?
J'ai rien trouvé dans les cours et tutoriels PHP.
Merci d'avance.
Salut,
voir :
exec
passthru
system
qui te permettent de passer des commandes au système.
Le reste est une affaire système d'exploitation
A+
Merci mais en fait J'ai essayé et il semblerait que la page PHP attende la fin du processus lancé avant de continuer.
J'aimerais que la page PHP continue à s'afficher sans se soucier du processus qu'il vient de lancer.
De la doc php
string exec ( string command [, array output [, int return_var]])
exec() execute la commande command, mais ne renvoie rien comme retour, hormis la dernière ligne du résultat de la commande. Pour exécuter une commande et obtenir le résultat sans aucun traitement, il faut utiliser la fonction passthru().
Si l'argument output est présent, alors ce tableau sera rempli par les lignes retournées par la commande. Il faut noter que si ce tableau contient des éléments, exec() ajoutera les nouvelles lignes à la fin du tableau. Si vous ne voulez pas que les nouveaux éléments soient concaténés, utilisez la fonction unset() avec ce tableau avant de le passer à exec().
Si l'argument return_var est présent en plus du tableau output, alors le statut de retour d'exécution sera inscrit dans cette variable.
Notez que si vous allez fournir des commandes qui proviennent d'un utilisateur, il est avisé d'utiliser la fonction escapeshellcmd() pour s'assurer que l'utilisateur n'essaie pas de profiter des caractères spéciaux pour tromper le système.
Note : Si vous démarrez un programme en utilisant cette fonction, et que vous voulez qu'il continue de fonctionner en tâche de fond, vous devez vous assurez que le résultat de ce programme est redirigé vers un fichier ou une autre méthode d'archivage, car sinon, PHP va attendre la fin de l'exécution du programme.
sinon si tu es sous linux, tu rajoute un & à la fin de ta ligne de commande pour qu'il te rende la main direct: ex: exec("scriptbidule.sh &");
Essaye comme ceci:
Si tu cherches une solution sans exec et compagnie (100% apache/php) j'ai aussi ça en stock (les fonctions exec() sont souvent désactivées en hébergement).
Code : Sélectionner tout - Visualiser dans une fenêtre à part exec ("/usr/local/bin/php /var/www/ton_script.php > /dev/null&");
met aussi l'autre solution ripat, je les mettrais dans la page des sources php.
Voici. J'ai du trouver cette solution pour un service tiers (gateway sms) qui envoie par http un message de confirmation. Son timeout (CURL) était très serré et je n'avais pas toujours le temps de mettre ma bdd à jour.
Le principe est d'envoyer vers le client un header contenant le fameux code 200 OK. Mais ce header seul, ne suffit pas, il faut terminer la connexion avec un header Content-Length. Comme on n'en connait pas la taille à l'avance, il faut buffériser.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 // envoi du header header("HTTP/1.1 200 OK"); // bufférisation de la sortie vers le client ob_start(); // ici tout code utile html et/ou php (envoyé éventuellement vers le client) $size = ob_get_length(); header("Content-Length: $size"); ob_end_flush(); flush(); // à partir de maintenant, le client a reçu un 200 OK et n'affiche plus rien // pour lui, la page est chargée et tout est terminé. Le client peut même // fermer son navigateur, le script peut continuer avec ce que vous voulez. Tout sauf sortie vers le client, bien sûr! // autre code PHP ... et fin (pas oublier de sortir en beauté car le client ne peut plus appuyer sur STOP si le script tombe en boucle infinie!)
C'est pour quelle utilisation web à priori ? Tu souhaites ne pas faire attendre tes visiteurs la fin d'un script pour afficher du html ?Envoyé par yakotey
Ben dans ce cas tu peux essayer avec des frames, celle qui lance ton processus en tâche de fond étant invisible !
Sinon sur php.net y a un post d'un programmeur qui fait ça en lançant des "GET" au serveur HTTP sans "lire" la réponse du serveur, à l'aide des socket (fsockopen()).
tu as le choix...
Exact. Je travaille également de cette manière quand j'ai le contrôle sur le script parent (celui qui lance le script qui doit tourner en tâche de fond).Envoyé par FFF
Si tu fais allusion à cette contribution:
http://php.net/manual/fr/ref.exec.php#51094
La piste donnée est bonne mais ne fonctionne pas telle quelle (l'auteur a résumé la connexion par socket en supposant une bonne connaissance de la syntaxe des header http).
Pour info, voici (en détail) comment faire avec les sockets:
Dans le header ne pas oublier le Connection: Close. A noter également que certains hébergeurs refusent les http request sans User-Agent. Si c'est le cas, il suffit de rajouter $header .= "User-Agent: PHP Script\r\n"; dans le header.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 // script parent = = = = = = = = = = = = = = = = = = // ici on stocke tous les scripts à lancer en tâche de fond $script = array( '/test/script_1.php', '/test/script_2.php' ); $host = 'localhost'; // ou tout autre host cible // ouverture des sockets (un par tâche à exécuter) foreach($script as $v){ echo "Script <b>$v</b> tourne en tâche de fond<br />"; $fp = fsockopen($host, 80, $errno, $errstr, 10); $header = "GET $v HTTP /1.1\r\n"; $header .= "Connection: Close\r\n\r\n"; fputs($fp, $header); fclose($fp); } // script enfant (p. exple: script_1.php) = = = = = = = = ignore_user_abort(true); // ici ce qui doit être exécuté en tâche de fond // ici aussi attention à ne pas entrer dans une boucle infinie! // plus moyen de l'arrêter (sauf timeout serveur) // pour s'en protéger --> set_time_limit()
J'ai galéré une journée là dessus. Mon hébergeur ne m'avait pas prévenu qu'il avait décidé de bloquer toute requête http sans User-Agent![]()
oui c'est ça l'idée.
Il y a une variante sur la même page, qui semble intéressante :
[/code]About the background functions below, many hosting service disable the exec or passthru functions.
It is still possible to run a script in background by sending a 200 OK header to the client?s browser.
Here is how:
<?php
header("HTTP/1.1 200 OK");
header("Content-Length: 0");
flush();
// code to be run in background here
// and, of course, no output to the client?s browser from here.
?>
And if you need to output something to the client?s browser before executing the code in the background:
<?php
header("HTTP/1.1 200 OK");
$text = 'Your html code here';
// IE hack to get the flush to work. Not needed for FF.
$text = strlen($text) > 256 ? $text : str_pad($text, 256);
ob_start();
echo $text;
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
// code to be run in background starts here.
// And, of course, no output to the client?s browser from here.
?>
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager