【发布时间】:2010-10-04 22:55:36
【问题描述】:
我正在尝试通过 PHP 命令行脚本执行 linux 命令,使用 exec 命令没有问题。
问题是,如果出现错误(例如用户/密码不正确),我正在执行的命令 (mysqldump) 会输出错误消息。我似乎无法捕获此错误以记录它。它只是将这个错误打印到屏幕上。
如何使这个错误不被打印到屏幕上,而是将它放在一个变量中以便在我的脚本中使用?
谢谢!
【问题讨论】:
我正在尝试通过 PHP 命令行脚本执行 linux 命令,使用 exec 命令没有问题。
问题是,如果出现错误(例如用户/密码不正确),我正在执行的命令 (mysqldump) 会输出错误消息。我似乎无法捕获此错误以记录它。它只是将这个错误打印到屏幕上。
如何使这个错误不被打印到屏幕上,而是将它放在一个变量中以便在我的脚本中使用?
谢谢!
【问题讨论】:
您看过system() 命令吗?自从我做任何 PHP 以来已经有一段时间了,但这敲响了警钟。
【讨论】:
尝试使用反引号?
$var = `命令`;【讨论】:
我对 Unix 不太感兴趣(新年决议...),但这些函数看起来很有帮助:
shell_exec - 以字符串形式返回结果。passthru - 看起来你可以像这样执行:passthru('command', $result);,然后使用$result。【讨论】:
exec("mysqldump -u user -p passwod database > outputfile.sql 2> error.log");
【讨论】:
你需要redirect stderr to stdout,这样你才能捕获它。此示例将 stdout 路由到 devnull(因此忽略它)并将 stderr 路由给您:
exec('ls * 2>&1 1>/dev/null');
【讨论】:
以下将stderr消息路由到与正常输出相同的位置。
exec("mysql_dump blah 2>&1",$output,$return_val)
if($return_val !== 0)
echo "there was an error"
2>&1 表示将 stderr 消息重新路由到与 stdout 相同的位置,因此将被加载到输出数组中。
【讨论】:
使用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);
?>
【讨论】: