2009-02-02 228 views
4

我试图通过一个PHP命令行脚本执行一个linux命令,使用exec命令没有问题。用PHP执行linux命令

问题是,我正在执行的命令(mysqldump)在出现错误时输出错误消息(例如用户名/密码不正确)。我似乎无法捕捉到这个错误以记录它。它只是将这个错误打印到屏幕上。

如何导致此错误不会被打印到屏幕上,而是将其放入一个变量以便在脚本中使用?

谢谢!

回答

0

你看过system()命令吗?自从我做了任何PHP以来,这已经有一段时间了,但是这听起来很响。

+0

这是一个别名EXEC – troelskn 2009-02-02 19:30:51

0

尝试使用反引号?

 

$var = `command`; 

1

我不是太热的Unix(新年分辨率...),但这些功能看起来有所帮助:

  • shell_exec - 返回结果为字符串。
  • passthru - 它看起来像你可以执行这样的:passthru('command', $result);,然后使用$result
2
exec("mysqldump -u user -p passwod database > outputfile.sql 2> error.log"); 
2

您需要redirect stderr to stdout,所以你可以捕捉它。本实施例中的路由标准输出到devnull(因此ignoreing它)和路线错误输出到你:

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

不要忘记清理任何用户输入! escapeshellarg,escapeshellcmd等 – 2009-02-02 15:47:28

0

下面将路由标准错误消息发送到同一个地方正常输出。

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

2> & 1装置重新路由标准错误消息发送到同一个地方标准输出,从而将被加载到输出数组。

4

使用popen来运行该过程。这个例子#2此页面上显示正是你要寻找的:

<?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:这是一个足够好的解决方案。但是我不是bash的粉丝,所以如果你愿意花更多的时间来处理错误,我建议你使用proc_open。 – artificialidiot 2009-02-02 19:25:35