通过php exec()运行mysqldump,管道到gzip,返回mysqldump stderr

时间:2013-01-02 09:24:46

标签: php error-handling exec mysqldump

请参见底部的解决方案

我正在运行mysqldump作为通过cron job调用的php脚本的一部分。

是否可以从mysqldump命令返回stderr,也许可以将其分配给可以直接读取的变量?或者是否可以将stderr分配给output命令的return_varexec()

正在使用的基本命令:

$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" | gzip -c > dumpfile.sql.gz';

exec( $dump_cmd, $dump_cmd_output, $dump_cmd_return_var );
来自output

return_varexec()无效:

$dump_cmd_output为空,因为输出通过管道传输到gzip。

$dump_cmd_return_var显示gzip的返回状态。


我知道其他方法可以查看mysqldump运行时是否有任何错误:

我可以在不压缩它的情况下进行转储,检查$dump_cmd_return_var的返回状态,然后运行gzip作为附加命令。

$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" --result-file="dumpfile.sql"';

$zip_cmd = 'gzip dumpfile.sql';

exec( $dump_cmd, $dump_cmd_output, $dump_cmd_return_var );

if($dump_cmd_return_var == 0) {
  exec( $zip_cmd, $zip_cmd_output, $zip_cmd_return_var );
}

我可以使用mysqldump的stderr选项将--log-error=dump_errors.txt从mysqldump发送到文件:

$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" --log-error=dump_errors.txt | gzip -c > dumpfile.sql.gz';

或者将stderr发送到管道2> dump_errors.txt之前的文件:

$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" 2> dump_errors.txt | gzip -c > dumpfile.sql.gz';

或者我可以尝试使用proc_open()。虽然我希望我遇到与exec()相同的问题,但执行命令(return_var)的返回状态显示gzip返回的状态。


如果直接返回任何错误或发送到可从脚本访问的变量,它会更清晰(更简单),所以我很好奇是否可能。


解决方案:

@ user1281385有一个很好的解决方案。为了更好地理解它,我搜索了:
“bash PIPESTATUS [0]”

一个结果使用了这个确切的场景(mysqldump管道传输到gzip)。这是任何想要了解更多信息的人的链接:
Bash - How to check the exit status of pipe command

以下是我使用它的方式:

$dump_cmd = 'mysqldump -u username -pPassword db_name --tables db_table --where="field1 = abc" | gzip -c > dumpfile.sql.gz';

system("bash -c '".$dump_cmd." ; exit \${PIPESTATUS[0]}'", $dump_cmd_return);

if($dump_cmd_return == 0) {
  Do some other stuff;
}

基本上,mysqldump命令是第一个执行的命令,因此它的返回值存储为PIPESTATUS数组的第一个值(key [0])。

1 个答案:

答案 0 :(得分:1)

proc_open是我用过的唯一方式

PHP StdErr after Exec()

类似的问题

如果它只是stderr你之后你可以将stdout重定向到无处并且stderr到stdout

或使用PIPESTAUS

系统(" bash -c' your_command;退出\ $ {PIPESTATUS [0]}'",$ return);

管道状态需要通过兼容的东西来调用。在这种情况下bash。

bash -c通过bash运行命令,PIPESTATUS将显示管道各部分的数组。