11

我有一个 PHP 脚本,它通过远程服务器的 MySQL 连接详细信息,我希望它执行mysqldump命令。为此,我正在使用 phpexec()函数:

<?php
exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql", $output);
?>

当正确的登录详细信息传递给它时,它会工作得很好。但是,我无法检查它是否按预期执行以及是否找不到原因。数组返回为空,而$output如果我直接在命令行上运行命令,则会打印出一条消息,告诉我登录失败。我想捕获此类错误消息并显示它们。关于如何做到这一点的任何想法?

4

6 回答 6

16

您应该检查exec函数的第三个参数:&$return_var.

$return_var = NULL;
$output = NULL;
$command = "/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql";
exec($command, $output, $return_var);

按照 Unix 中的约定,当出现问题时,进程会返回 0 以外的任何值

所以你可以:

if($return_var) { /* there was an error code: $return_var, see the $output */ }
于 2012-07-26T23:13:10.533 回答
7

我找到的解决方案是在子shell中运行命令,然后输出stderrstdout2>&1)。这样,$output变量将填充错误消息(如果有)。

IE :

exec("(mysqldump -uroot -p123456 my_database table_name > /path/to/dump.sql) 2>&1", $output, $exit_status);

var_dump($exit_status); // (int) The exit status of the command (0 for success, > 0 for errors)
echo "<br />";
var_dump($output); // (array) If exit status != 0 this will handle the error message. 

结果 :

整数(6)

数组(1){[0]=>字符串(46)“mysqldump:找不到表:”table_name“”}

希望能帮助到你 !

于 2016-10-13T10:12:54.260 回答
4

因为这一行重定向标准输出输出> /path-to-export/file.sql 试试这个,

<?php 
exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name", $output);
/* $output will have sql backup, then save file with these codes */
$h=fopen("/path-to-export/file.sql", "w+");
fputs($h, $output);
fclose($h);
?> 
于 2012-07-26T23:12:12.503 回答
3

我一直在寻找完全相同的解决方案,我记得几年前我已经解决了这个问题,但忘记了。

由于这个页面在谷歌中的问题很高,所以我是这样做的:

<?php
define("BACKUP_PATH", "/full/path/to/backup/folder/with/trailing/slash/");

$server_name   = "your.server.here";
$username      = "your_username";
$password      = "your_password";
$database_name = "your_database_name";
$date_string   = date("Ymd");

$cmd = "mysqldump --hex-blob --routines --skip-lock-tables --log-error=mysqldump_error.log -h {$server_name} -u {$username} -p{$password} {$database_name} > " . BACKUP_PATH . "{$date_string}_{$database_name}.sql";

$arr_out = array();
unset($return);

exec($cmd, $arr_out, $return);

if($return !== 0) {
    echo "mysqldump for {$server_name} : {$database_name} failed with a return code of {$return}\n\n";
    echo "Error message was:\n";
    $file = escapeshellarg("mysqldump_error.log");
    $message = `tail -n 1 $file`;
    echo "- $message\n\n";
}
?>

这是我总是忘记的 mysqldump的--log-error=[/path/to/error/log/file]部分!

于 2014-01-31T14:26:11.940 回答
1

正如exec()获取stdout重定向到文件的内容一样,我们在文件中有部分或丢失的结果,我们不知道为什么。我们必须从那里得到消息stderrexec()但不能这样做。有几种解决方案,都已经找到了,所以这只是一个总结。

  1. Jon的解决方案:记录错误mysqldump并分别处理它们(不能适用于每个命令)。
  2. 将输出重定向到单独的文件,即mysqldump ... 2> error.log 1> dump.sql像以前的解决方案一样单独读取错误日志。
  3. JazZ的解决方案:将转储写入子shell 并将子shell 的stderr 重定向到stdout,它可以phpexec()放入$output变量中。
  4. Pascal 的解决方案:最好使用proc_open()而不是exec()因为我们可以单独获取stdoutstderr(直接从管道)。
于 2017-02-04T12:56:53.970 回答
0

编写以下代码以获取 .sql 文件中的数据库导出。

<?php exec('mysqldump --user=name_user --password=password_enter --host=localhost database_name > filenameofsql.sql'); ?>
于 2017-07-28T19:48:17.467 回答