解决方法见底部
我mysqldump
作为通过 cron 作业调用的 php 脚本的一部分运行。
是否可以stderr
从 mysqldump 命令返回,也许将其分配给可以直接读取的变量?或者是否可以分配stderr
给命令的output
或?return_var
exec()
使用的基本命令:
$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_var
fromexec()
没有帮助:
$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])。