27 votes

PHP exec() n'exécute pas la commande shell lorsqu'il est exécuté via le navigateur

J'ai un certain script PHP qui appelle exec() pour exécuter une commande pour convertir un PDF en JPG. Cette commande fonctionne bien dans bash.

Pour anticiper vos premières suppositions de dépannage, notez ce qui suit :

  • safe_mode = Off
  • La permission sur le répertoire contenant le PDF et le script est fixée à 777, et ce répertoire est aussi celui où le JPG est écrit.
  • La commande que je passe à exec() pointe explicitement vers le binaire utilisé (par exemple /usr/local/bin/convert).
  • display_errors = On
  • error_reporting = E_ALL
  • disable_functions = [blank]
  • Je fais écho à la sortie de exec() et elle ne renvoie rien. La commande exécutée par défaut ne renvoie rien.

Lorsque j'appelle ce script PHP depuis le navigateur (en visitant http://www.example.com/script.php ), exec() n'exécute pas son argument.

IMPORTANT : Je sais qu'il n'y a aucun problème avec mon script ou la façon dont j'ai construit la commande bash, car depuis bash, je peux exécuter le script avec 'php' et cela fonctionne (par exemple, 'php script.php' convertit le fichier).

J'ai également essayé de remplacer exec() par system().

Enfin, j'ai déjà eu ce problème une fois dans le passé mais je ne me souviens plus comment je l'ai résolu.

Je sais qu'il y a quelque chose qui m'échappe, alors j'espère que quelqu'un d'autre a vécu la même expérience que moi et se souvient de la solution !

Nous vous remercions par avance de l'aide que vous pourrez nous apporter.

Alex

46voto

Greg Points 132247

Ajouter 2>&1 à la fin de votre commande pour rediriger les erreurs de stderr vers stdout. Cela devrait permettre de comprendre ce qui ne va pas.

5voto

TomHastjarjanto Points 4543

Juste une supposition, il se peut que l'utilisateur de votre processus de serveur web n'ait pas les privilèges pour le faire.

4voto

Chad Birch Points 39087

Étant donné qu'il fonctionne à partir de la ligne de commande (qui serait sous votre propre compte d'utilisateur), il me semble que le compte sous lequel le serveur web est exécuté (souvent "www-data") n'a pas les droits d'exécution sur le programme de conversion.

2voto

ConroyP Points 24021

Votre utilisateur Apache/webserver dispose-t-il des droits nécessaires pour exécuter la commande shell ?

Lorsque vous vous exécutez à partir de la cl, vous vous exécutez probablement sous un autre utilisateur, ce qui peut expliquer que la cl fonctionne mais pas le navigateur.

2voto

Amy Anuszewski Points 1228

Avez-vous pris en compte les autorisations de fichiers ? Dans le navigateur, php s'exécute sous un utilisateur, mais lorsque vous l'exécutez dans bash, il s'exécute probablement avec les autorisations de votre utilisateur.

C'est la première chose que je vérifierais.

Amy

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X