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 :

Exécuter un script PHP CLI en background


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 59
    Par défaut Exécuter un script PHP CLI en background
    Bonjour à tous,

    Je fais appel à vous car j'ai un problème sur lequel je galère... En gros j'ai besoins d'exécuter du php cli en background via une page .php accessible du web. Je fais donc un petit test avec 3 pages :

    - un fichier "test.php" (qui sera accessible du web et qui exécutera le script php CLI)
    - une classe "run.class.php" (qui permet d’exécuter un script en background)
    - le script PHP CLI nommé "test"

    Voici ces fichiers :

    test.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
       require_once("run.class.php");
     
       $cmd = "/var/www/test";
     
       $obj = new Run();
       $obj->runBackground($cmd, $priority=null);
     
    ?>
    run.class.php :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php
     
    class Run {
     
       // {{{ backgroundRun()
     
       /** Lancer le processus en tache de fond
        *
        * @return  int  retourne le pid
        * @param   string  $cmd   La commande a lancer
        * @param   int     $priority   La priorité du process
        *
        */
       public static function runBackground($cmd, $priority=null)
       {
           if($priority) {
               $pid = shell_exec('nohup nice -n '.$priority.' '.$cmd.' 2> /dev/null & echo $!');
           } else {
               $pid = shell_exec('nohup '.$cmd.' 2> /dev/null & echo $!');
           }
           return $pid;
       }
     
       // }}}
     
       // {{{ isProcessRunning()
     
       /** Voir l'état du process
        *
        * @return int
        * @param   int     $pid    Le PID
        *
        */
       public static function isProcessRunning($pid)
       {
           exec('ps '.$pid, $process_state);
           return count($process_state) >= 2;
       }
     
       // }}}
     
       // {{{ stopProcess()
     
       /** Stopper le processus
        *
        * @return  bool
        * @param   int     $pid    le pid du process
        *
        */
       public static function stopProcess($pid)
       {
           exec('kill -9 '.$pid);
           return true;
       }
     
       // }}}
     
       // {{{ messageStop()
     
       /** Stopper l'envoi du message proprement
        *
        * @return  bool
        * @param   int     $pid    le pid du process
        *
        */
       public static function messageStop($idmessage)
       {
           // on ajout un fichier dans temp
           if(!is_dir(JELIX_APP_LOG_PATH.'process/')) {
               if(!mkdir(JELIX_APP_LOG_PATH.'process/', 0755)) {
                   echo 'Impossible de créer le répertoire '.JELIX_APP_LOG_PATH.'process/';
                   exit;
               }
           }
           if(!is_writable(JELIX_APP_LOG_PATH.'process/')) {
               echo 'Impossible d\'écrire dans le répertoire '.JELIX_APP_LOG_PATH.'process/';
               exit;
           }
           // on écrit un fichier pour dire stop
           if(file_put_contents(JELIX_APP_LOG_PATH.'process/stop_now_'.$idmessage, 1)) {
               return true;
           } else {
               echo "Impossible de notifier l'arrêt du message";
               exit;
           }
       }
     
    }
     
    ?>
    test :

    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
    #!/usr/bin/php
    <?php
     
    $racine = '/var/www/';
    $file = $racine.'test.txt';
    $fp = fopen($file,"w");
     
    if($fp AND is_writable($file))
    {
       for($i=0;$i<100;$i++) {
     
           fwrite($fp, $i.' ');
     
              if(file_exists($racine.'stop_script')) {
                     unlink($racine.'stop_script');
                     exit;
            }
                sleep(1);
       }
       fclose($fp);
    }
    else
       echo 'PB POUR ECRIRE';
    ?>
    C'est un petit test vite fait pour voir si cela fonctionne. Et cela fonctionne bien. ça écrit bien dans le fichier. Si je coupe le test.php, cela continue à écrire dans le fichier. Et si je place le fichier stop script dans le répertoire, cela s'arrête. C'est donc bon mais... oui il y a un MAIS... seulement si j'exécute le fichier test.php depuis le serveur avec php -f /var/www/test.php

    Si je le fait depuis le web, il ne se passe rien ! Et je ne sais pas vraiment pourquoi...

    Auriez-vous une idée du pourquoi ?

    Merci bien

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Par défaut logs d'erreur
    bonjour,
    les logs apache disent quoi ?
    il y a peut-être un problème de chemin pour les include lorsque le script est lancé depuis le navigateur.

Discussions similaires

  1. Exécuter un script php en background ou en parallèle
    Par randriano dans le forum Langage
    Réponses: 22
    Dernier message: 04/01/2013, 15h52
  2. Réponses: 10
    Dernier message: 06/03/2007, 11h07
  3. Réponses: 3
    Dernier message: 26/02/2007, 19h19
  4. [AJAX] XMLHTTPRequest => impossible d'exécuter tout script php
    Par AzertyH dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 24/11/2006, 19h01
  5. [FLASH MX2004] Exécution de script PHP
    Par dleu dans le forum Flash
    Réponses: 2
    Dernier message: 30/03/2005, 19h10

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