8796 sujets

Développement web côté serveur, CMS

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 Smiley smile
Modifié par newty (24 May 2011 - 15:19)