我有一个PHP脚本,它传递了远程服务器的MySQL连接细节,我希望它执行mysqldump
命令。为此,我使用php exec()
函数:
<?php
exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql", $output);
?>
当正确的登录详细信息传递给它时,它将完全正常工作。
但是,我无法检查,如果按预期执行,如果它没有找到原因。
$output
数组返回为空,而如果我直接在命令行上运行命令,则会打印一条消息,告诉我登录失败。我想捕获这些错误消息并显示它们。关于如何做到的任何想法?
答案 0 :(得分:15)
您应该检查 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 */ }
答案 1 :(得分: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);
?>
答案 2 :(得分:4)
我找到的解决方案是在子shell中运行命令,然后将stderr
输出到stdout
(2>&1
)。这样,$output
变量将填充错误消息(如果有)。
即。 :
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.
结果:
INT(6)
array(1){[0] =&gt; string(46)“mysqldump:找不到表:”table_name“”}
希望它有所帮助!
答案 3 :(得分:3)
我一直在寻找完全相同的解决方案,我记得几年前我已经解决了这个问题,但却忘了它。
由于此页面在Google中的问题很高,所以我就是这样做的:
<?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] 部分!
答案 4 :(得分:1)
由于exec()
只提取重定向到文件的stdout
,我们在文件中有部分或缺少结果,我们不知道原因。我们必须从stderr
收到消息,exec()
不能这样做。有几种解决方案,所有这些都已经找到,所以这只是一个总结。
mysqldump
的错误并单独处理(不能应用于每个命令)。mysqldump ... 2> error.log 1> dump.sql
,并像以前的解决方案一样单独读取错误日志。exec()
放入$output
变量。proc_open()
代替exec()
,因为我们可以分别(直接来自管道)获取stdout
和stderr
。答案 5 :(得分:0)
编写以下代码以在.sql文件中导出数据库。
<?php exec('mysqldump --user=name_user --password=password_enter --host=localhost database_name > filenameofsql.sql'); ?>