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 :
run.class.php :
test :
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
Modifié par newty (24 May 2011 - 15:19)
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

Modifié par newty (24 May 2011 - 15:19)