11

リモートサーバーの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);
?>

正しいログインの詳細が渡されると、それは完全に正常に機能します。ただし、期待どおりに実行されるかどうか、またその理由がわからないかどうかを確認するのに問題があります。配列は$output空として返されますが、コマンドラインで直接コマンドを実行すると、ログインに失敗したことを示すメッセージが出力されます。そのようなエラーメッセージをキャプチャして表示したいと思います。それを行う方法について何かアイデアはありますか?

4

6 に答える 6

16

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 */ }
于 2012-07-26T23:13:10.533 に答える
4

この行は 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);
?> 
于 2012-07-26T23:12:12.503 に答える
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]部分です!

于 2014-01-31T14:26:11.940 に答える
1

exec()ファイルにリダイレクトされたものだけを取得しているため、ファイルに部分的な結果stdoutまたは欠落している結果があり、その理由はわかりません。からメッセージを取得する必要がstderrありますが、それexec()はできません。いくつかの解決策があり、すべてがすでに見つかっているため、これは単なる要約です。

  1. Jon からの解決策: エラーをログに記録mysqldumpし、個別に処理します (すべてのコマンドに適用することはできません)。
  2. 出力を別のファイルにリダイレクトします。つまりmysqldump ... 2> error.log 1> dump.sql、前のソリューションと同様に、エラー ログを個別に読み取ります。
  3. JazZ からの解決策: ダンプをサブシェルとして記述し、サブシェルの stderr を stdout にリダイレクトします。これにより、phpが変数exec()に入れることができます。$output
  4. Pascal からの解決策:とを別々に (パイプから直接)取得できるため、proc_open()代わりに使用することをお勧めします。exec()stdoutstderr
于 2017-02-04T12:56:53.970 に答える