Exécuter un script PHP CLI en background

Petit nouveau ! | 3 Messages

24 mai 2011, 14:38

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 :
<?php

   require_once("run.class.php");

   $cmd = "/var/www/test";

   $obj = new Run();
   $obj->runBackground($cmd, $priority=null);

?>
run.class.php :
<?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 :
#!/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 :)

Eléphant du PHP | 92 Messages

25 mai 2011, 13:11

Hello,

Je ne suis pas sûr que l'utilisateur qui exécute php quand tu es en mode CLI et quand tu es en mode Web soit le même...
Il est donc possible que se soit un problème de droit.

Est ce que tu as activé les logs ?
Si oui est ce qu'il y a des logs d'erreurs ?
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

ViPHP
ViPHP | 2577 Messages

25 mai 2011, 14:18

Bonjour,
...
depuis le serveur avec php -f /var/www/test.php
...
Dans le même ordre d'idée, ne faut il pas préciser le chemin pour la commande php ?