3

解决方法见底部

mysqldump作为通过 cron 作业调用的 php 脚本的一部分运行。

是否可以stderr从 mysqldump 命令返回,也许将其分配给可以直接读取的变量?或者是否可以分配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 );

outputreturn_varfromexec()没有帮助:

$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 );
}

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

$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 - 如何检查管道命令的退出状态

这是我使用它的方式:

$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 数组的第一个值(键 [0])。

4

1 回答 1

1

proc_open是我使用的唯一方法

Exec() 之后的 PHP StdErr

一个类似的问题

如果它只是你的标准错误,你可以将标准输出重定向到无处和标准错误到标准输出

或使用 PIPESTAUS

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

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

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

于 2013-01-02T09:32:33.227 回答