web-dev-qa-db-fra.com

Comment récupérer PHP exec () réponses d'erreur?

Voici la commande que j'ai essayé d'exécuter, sans succès:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess');

Quand vous ajoutez un die () à la fin, il y a une erreur:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!');

Pour l'instruction exec () ci-dessus, un problème d'autorisations est à l'origine de l'erreur, mais PHP ne l'affiche pas. Comment affichez-vous de PHP quelle erreur se produit?

23
Matt

Vous pouvez recevoir le résultat de la fonction exec en transmettant un second paramètre facultatif:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
var_dump($output);
17
Eran Galperin

Le paramètre $ output ne semble pas fonctionner si le programme appelant génère une sortie vers STDERR.

Une meilleure solution consiste à rediriger la sortie de exec vers un fichier, puis à afficher le contenu de ce fichier en cas d'erreur.

Si $ cmd détient la commande exec, ajoutez quelque chose comme ceci:

$cmd.=" > $error_log 2>&1"

Ensuite, examinez le contenu de la spécification de fichier dans $ error_log pour obtenir des informations détaillées sur la raison de l'échec de la commande.

Notez également que si vous supprimez ceci avec un & à la fin de la commande, une vérification immédiate du contenu de $ error_log peut ne pas révéler les informations du journal - le script peut vérifier/traiter le fichier avant la fin du système d'exploitation.

12
S.ov

Le code suivant va capturer à la fois la sortie normale (de StdOut) et la sortie d'erreur (de SdtErr).

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output);
var_dump($output);
9
Amaynut

cela a fonctionné pour moi: Ajoutez 2> & 1 à la fin de votre commande.

Vu ici: php exec () ne renvoie pas de message d'erreur lors de l'exécution de la commande svn

À votre santé

7
luciomonter

Cela a fonctionné pour moi dans plusieurs scénarios:

 ob_start();
 exec($cmd . " 2>&1", $output);
 $result = ob_get_contents();
 ob_end_clean();
 var_dump($result);

L'espace entre "2 est important

5

Si vous ne trouvez pas l'erreur dans ce deuxième paramètre, vous pouvez rechercher le journal des erreurs d'Apache, par exemple dans Ubuntu Server 12.10, via la commande $ tail /var/log/Apache2/error.log. J'exécutais un script python. de php, dont l'erreur a été seulement imprimée là, et donc j'ai pu le diagnostiquer. Meilleures salutations.

3
David L

Ceci n'est pas une réponse directe à votre question, mais est très utile si vous voulez savoir ce qui s'est passé exactement avec le code d'erreur renvoyé.

Si code d'erreur ($ res), renvoyé par la commande:

exec('command', $out, $res);

était compris entre 1-2, 126-165, 255, par rapport au résultat renvoyé par Shell (par exemple, BASH) invoquée à partir de PHP (pour exécuter votre commande). Si le code renvoyé ne se trouve pas dans cette plage, il a été renvoyé par votre commande (pas Shell).

Voir (pour les descriptions des codes d'erreur BASH)

https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html

0
maximusin9