IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Système] Processus en tâche de fond [Sources]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 67
    Points : 47
    Points
    47
    Par défaut [Système] Processus en tâche de fond
    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.

  2. #2
    Membre confirmé Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Points : 587
    Points
    587
    Par défaut
    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+

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    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.

  4. #4
    Membre confirmé Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Points : 587
    Points
    587
    Par défaut
    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.

  5. #5
    Membre confirmé Avatar de GregPeck
    Inscrit en
    Novembre 2005
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 530
    Points : 540
    Points
    540
    Par défaut
    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 &");

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Essaye comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec ("/usr/local/bin/php /var/www/ton_script.php > /dev/null&");
    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).

  7. #7
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    met aussi l'autre solution ripat, je les mettrais dans la page des sources php.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    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!)

  9. #9
    Expert confirmé
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Points : 5 011
    Points
    5 011
    Par défaut
    merci a toi ripat

  10. #10
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut Re: Processus en tâche de fond
    Citation Envoyé par yakotey
    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é?

    Merci d'avance.
    C'est pour quelle utilisation web à priori ? Tu souhaites ne pas faire attendre tes visiteurs la fin d'un script pour afficher du html ?
    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...

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut Re: Processus en tâche de fond
    Citation Envoyé par FFF
    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).

    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:

    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()
    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.

    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

  12. #12
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    oui c'est ça l'idée.

    Il y a une variante sur la même page, qui semble intéressante :
    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.

    ?>
    [/code]

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/02/2009, 13h01
  2. Réponses: 9
    Dernier message: 06/05/2008, 14h04
  3. Service / Tâche de fond
    Par Invité dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 06/02/2006, 18h23
  4. executable en "tâche de fond"
    Par jaquet_vincent dans le forum Windows
    Réponses: 5
    Dernier message: 22/10/2004, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo