Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 14h35   #1
Invité régulier
 
Inscription : avril 2007
Messages : 54
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 54
Points : 7
Points : 7
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 :
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 :
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 :
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
newty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 22h08   #2
Membre régulier
 
Homme
Développeur Web
Inscription : octobre 2009
Messages : 72
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Vietnam

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2009
Messages : 72
Points : 99
Points : 99
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.
matlow est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h15.


 
 
 
 
Partenaires

Hébergement Web