web-dev-qa-db-fra.com

Ne peut pas exécuter PHP script utilisant PHP exec

J'essaie d'appeler un script qui prend plusieurs secondes (services Web avec une tierce partie) à l'aide de l'appel PHP exec. Après beaucoup de difficultés, j'ai réduit cela à l'exemple classique du monde du salut. Le script d'appel ressemble à:

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');

Lorsque je lance ceci, la sortie execoutput.txt contient une copie de la page de script qui appelle, pas hello world comme prévu.

Pourquoi est-ce que je ne peux pas obtenir ce script PHP à exécuter avec exec? Notez que lorsque je modifie la commande à quelque chose comme ls -l, la sortie est une liste de répertoires comme prévu. Au fait, au cas où cela importerait, j'ai chmod le script appelé en 755 ...

Update - J'ai déplacé l'appel exec à la fin du script d'appel et au moins, je ne vois pas le script d'appel exécuté dans la sortie. Merci aux affiches et je vais essayer certaines de ces idées.

Aidez-moi!

Merci Steve

15
Steve

J'ai eu ce problème aussi et il s'avère que c'est un bogue dans php (# 11430). Le correctif consiste à utiliser php-cli lors de l'appel d'un autre script php au sein d'un script php. Donc, vous pouvez toujours utiliser exec, mais plutôt que php, utilisez php-cli lorsque vous l'appelez dans le navigateur:

exec("php-cli  somescript.php");

Cela a fonctionné pour moi.

28
Keith

Ce que exec fait, c'est prendre la commande la plus à droite et l'ajouter à votre destination. Si vous avez la ligne Shebang dans votre script php, vous ne devriez pas avoir besoin d'inclure la directive binaire de l'interpréteur php.

si vous voulez juste la sortie du script, essayez: 

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &')

toutefois, si vous ne souhaitez pas que les erreurs se trouvent dans le fichier, vous devez rediriger le STDERR avant de le générer dans le fichier. Ainsi:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt')

ce qui précède ne doit générer le "Hello World" que vers l'exécutable.

Modifier:

Intéressant que vous obtenez ce comportement. Vous avez déclaré que la commande "ls" fonctionnait. Essayez de créer un alias pour cela et de le transférer dans un fichier comme suit: 

alias pexec='php /home/quote2bi/tmp/helloworld.php' 

puis 

exec('pexec > /tmp/execoutput.txt 2>&1 &')

cela semble être un problème avec la façon dont exec gère les entrées par opposition au Shell lui-même.

-John

16
John T

Le problème vient de PHP lui-même, il traite tout comme $ argv dans le script. Il ne redirige pas la sortie vers un fichier ou vers/dev/null.

J'ai rencontré le même problème il y a quelque temps. Ce que j’ai fait est de créer un runscript.php dans/opt/php-bin puis, à l’intérieur de ce script, d’exécuter ce qu’il devrait exécuter. Quelque chose comme ça:

$script = $argv[1]
$params = implode(' ', array_slice($argv, 2));
$cmd    = "{$script} {$params} > /dev/null &";

$output = array();
$return = 0;
exec("php {$cmd}", $output, $return);

exit((int)$return);

Et puis vous l'appelez en utilisant:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2')

C’est la seule façon pour moi de faire en sorte que cela fonctionne.

8
Luiz Damim

si vous exécutez simplement un script php, une méthode possible pour exécuter tout le code consiste à utiliser la commande include () qui exécutera le fichier php et affichera les résultats. Vous ne pouvez pas diriger la sortie vers un fichier texte, mais elle devrait apparaître dans la fenêtre du navigateur si vous êtes similaire au script php Hello World

<?php echo "Hello World!"; ?>

alors il va cracher cela dans le navigateur. Donc, votre deuxième code ressemblerait à

<?php include("helloWorld.php");  echo " PHP ROCKS";?>

résultant en une page qui ressemblerait,

Bonjour le monde! PHP ROCKS

1
Nathan

Pour éviter les problèmes déclarés de PHP dans cette zone, pourquoi ne pas l'insérer dans un script Shell? PHP peut ensuite exécuter le script Shell qui gère toutes les redirections en interne.

Si vous avez besoin de changer dynamiquement des choses, alors pourquoi ne pas écrire le script Shell et ensuite l'exécuter (et bien sûr, nettoyer après)?

0
Jeremy L

Cela fonctionne comme si vous exécutiez le script à partir du navigateur.

Cela est apparu alors que je travaillais sur un projet sur une plate-forme Linux.

exec('wget http://<url to the php script>)

J'espère que cela t'aides!!

0
Amar