STDERR
以上、おそらくSTDOUT
にアクセスする必要があります。もちろんproc_open、例えば:
$desc = [
1 => ['pipe', 'w'], // STDOUT
2 => ['pipe', 'w'], // STDERR
];
$proc = proc_open('ls -l . something', $desc, $pipes);
if (is_resource($proc)) {
if ($out = stream_get_contents($pipes[1])) {
echo $out;
}
fclose($pipes[1]);
if ($err = stream_get_contents($pipes[2])) {
fprintf(STDERR, "Error: %s\n", $err);
}
fclose($pipes[2]);
// You can also check the process exit status
// 0 means success, otherwise error.
$exit_status = proc_close($proc);
}
使用するコマンドは、ファイルにリダイレクトする場合は、STDOUT
パイプ内の必要はありません。
はい、system()
は例外をスローしません。
class MyShellException extends \Exception {}
class MyShell {
public static function execute($command, &$out = null) {
if (func_num_args() > 1) {
$desc[1] = ['pipe', 'w'];
} else {
$desc[1] = ['file', '/dev/null'];
}
$desc[2] = ['pipe', 'w'];
$proc = proc_open($command, $desc, $pipes);
if (is_resource($proc)) {
if (isset($pipes[1])) {
$out = stream_get_contents($pipes[1]);
fclose($pipes[1]);
}
if ($err = stream_get_contents($pipes[2])) {
fclose($pipes[2]);
throw new MyShellException("Command $command failed: $err");
}
if ($exit_status = proc_close($proc)) {
throw new MyShellException("Command $command exited with non-zero status");
}
}
}
}
try {
MyShell::execute('ls -l . something', $out);
echo "Output: $out\n";
} catch (MyShellException $e) {
if (!empty($out)) {
echo "Output: $out\n";
}
fprintf(STDERR, "MyShell error: " . $e->getMessage());
exit(1);
}
外部/システムコールは、それ自体が例外を生成しません。 – mario
'' .dump master'? '$ PATH'で実行可能な' .dump'を検索するか、現在の作業ディレクトリにある 'dump'を実行する' ./dump master'を使用しますか?とにかく絶対パスを構築することをお勧めします。たとえば、 '$ cmd = __DIR__。 '/../somewhere/dump master''または '$ cmd = YOUR_ROOT_DIR。 '/ bin/dump master'' –
私はエラーについては確信していません。私はtry..catchについて語る。私はそれが何か誤りであることを知っている。 – abkrim