2009-02-02 6 views
4

J'essaie d'exécuter une commande Linux via un script de ligne de commande PHP, ce qui ne pose aucun problème lors de l'utilisation de la commande exec.Exécution de commandes Linux avec PHP

Le problème est que la commande que j'exécute (mysqldump) génère un message d'erreur si quelque chose ne va pas (par exemple, l'utilisateur/mot de passe est incorrect). Je ne peux pas sembler capable de capturer cette erreur afin de l'enregistrer. Il imprime juste cette erreur à l'écran. Comment est-ce que je fais que cette erreur ne soit pas imprimée à l'écran, mais au lieu de la mettre dans une variable pour l'usage dans mon manuscrit?

Merci!

Répondre

0

Avez-vous regardé la commande system()? Cela fait un moment que je n'ai pas fait de PHP, mais ça me dit quelque chose.

+0

C'est un alias pour exec – troelskn

0

avez-vous essayé d'utiliser des backals?

 

$var = `command`; 

1

Je ne suis pas trop chaud sous Unix (résolution du Nouvel An ...) mais ces fonctions regard utiles:

  • shell_exec - renvoie le résultat comme une chaîne.
  • passthru - Il semble que vous pouvez exécuter ceci comme: passthru('command', $result); et ensuite utiliser $result.
2
exec("mysqldump -u user -p passwod database > outputfile.sql 2> error.log"); 
2

Vous devez redirect stderr to stdout, de sorte que vous pouvez capturer. Cet exemple routes STDOUT devnull (ainsi ignoreing il) et les itinéraires pour vous stderr:

exec('ls * 2>&1 1>/dev/null'); 
+0

Ne pas oublier de désinfecter toute entrée d'utilisateur! escapeshellarg, escapeshellcmd, etc. –

0

Les messages STDERR d'itinéraire suivant au même endroit que la sortie normale.

exec("mysql_dump blah 2>&1",$output,$return_val) 
if($return_val !== 0) 
echo "there was an error" 

2> 1 & moyens re-router les messages stderr au même endroit que la sortie standard, et donc seront chargés dans le tableau de sortie.

4

Utilisez popen pour exécuter le processus. L'exemple # 2 sur cette page montre exactement ce que vous cherchez:

<?php 
error_reporting(E_ALL); 

/* Add redirection so we can get stderr. */ 
$handle = popen('/path/to/spooge 2>&1', 'r'); 
echo "'$handle'; " . gettype($handle) . "\n"; 
$read = fread($handle, 2096); 
echo $read; 
pclose($handle); 
?> 
+0

@edanb: C'est une solution assez bonne. Mais je ne suis pas fan de bash, donc je recommande proc_open si vous êtes prêt à passer un peu plus de temps à gérer les erreurs. – artificialidiot

Questions connexes