リモートサーバーのMySQL接続の詳細を渡すPHPスクリプトがあり、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);
?>
適切なログインの詳細が渡されると、それは完全に正常に機能します。ただし、チェックに問題がありますif期待どおりに実行され、理由がわからない場合。 $output
配列は空として返されますが、コマンドラインで直接コマンドを実行すると、ログインに失敗したことを示すメッセージが出力されます。そのようなエラーメッセージをキャプチャして表示したいと思います。それを行う方法についてのアイデアはありますか?
exec関数の3番目のパラメーターを確認する必要があります:&$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 */ }
この行はstdout出力をリダイレクトするため> /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);
?>
私が見つけた解決策は、サブシェルでコマンドを実行してから、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] => string(46) "mysqldump:テーブルが見つかりませんでした:" table_name ""}
それが役に立てば幸い !
私はまったく同じ解決策を探していました。数年前にすでにこれを解決したことを思い出しましたが、それを忘れていました。
このページは質問のためにグーグルで高いので、これが私がそれをした方法です:
<?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";
}
?>
私がいつも忘れているのは-log-error = [/ path/to/error/log/file] mysqldumpの一部です!
exec()
はファイルにリダイレクトされるstdout
だけをフェッチしているため、ファイルに部分的または欠落した結果があり、その理由はわかりません。 stderr
からメッセージを取得する必要があり、exec()
はそれを実行できません。いくつかの解決策がありますが、すべてがすでに見つかっているので、これは単なる要約です。
mysqldump
からエラーをログに記録し、個別に処理します(すべてのコマンドに適用できるわけではありません)。mysqldump ... 2> error.log 1> dump.sql
_にリダイレクトし、前のソリューションと同様にエラーログを個別に読み取ります。exec()
を_$output
_変数に入れることができます。stdout
とstderr
を別々に(直接)取得できるため、proc_open()
の代わりにexec()
を使用することをお勧めしますパイプから)。以下のコードを記述して、データベースを.sqlファイルにエクスポートします。
<?php exec('mysqldump --user=name_user --password=password_enter --Host=localhost database_name > filenameofsql.sql'); ?>