3

解決策については下を参照してください

mysqldumpcronジョブを介して呼び出されるphpスクリプトの一部として実行しています。

mysqldumpコマンドから戻ることは可能stderrですか、直接読み取ることができる変数に割り当てることはできますか?または、コマンドstderroutputまたはに割り当てることは可能ですか?return_varexec()

使用されている基本的なコマンド:

$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 );

outputreturn_varからexec()は役に立ちません:

$dump_cmd_output出力がgzipにパイプされるため、は空です。

$dump_cmd_return_vargzipからの戻りステータスを示します。


mysqldumpの実行中にエラーが発生したかどうかを確認する他のアプローチを知っています。

gzipで圧縮せずにダンプを実行$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 );
}

mysqldumpのオプションをstderr使用して、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には素晴らしい解決策があります。それをよりよく理解するために、
「bashPIPESTATUS[0]」を検索しました。

1つの結果は、この正確なシナリオを使用しました(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])として格納されます。

4

1 に答える 1

1

proc_open使用される唯一の方法です

Exec()後のPHP StdErr

同様の質問

stdoutをどこにもリダイレクトせず、stderrをstdoutにリダイレクトした後、それがstderrだけの場合

またはPIPESTAUSを使用してください

system( "bash -c'your_command; exit \ $ {PIPESTATUS [0]}'"、$ return);

パイプステータスは、互換性のあるものを介して呼び出す必要があります。この場合はbashです。

bash -cは、bashを介してコマンドを実行し、PIPESTATUSはパイプの各部分の配列を表示します。

于 2013-01-02T09:32:33.227 に答える