Раздел вопрос-ответ shell_exec возвращает вывод без STDERR

shell_exec('svn commit filename', $output);

Переменная $output после shell_exec содержит STDOUT. Но, в этом выводе нет всех необходимых данных, например строки 'commited revision'. И, нет описания ошибки, почему команда не выполнилась. 

То есть содержимое переменной $output отличается от содержимого, которое выводится при выполнении команды в консоли напрямую.

share

1 ответ

Описание ошибки, возможно, может быть в STDERR.

Для этого, если использовать shell_exec, можно перенаправить вывод STDERR в STDOUT. Для этого надо добавить " 2>&1" в конец команды.

Например:

shell_exec('svn commit -m "commit message" 2>&1', $output);

После этого проверять $output. Нет гарантий, что это будет 100% работать. Разные команды бросают свой вывод по-разному.


Альтернативным вариантом c хэндлингом ошибок процесса является использование proc_open и обработкой php-потоков мануально. Пример:

$desc = [
1 => ['pipe', 'w'], // STDOUT
2 => ['pipe', 'w'], // STDERR
];

$proc = proc_open(sprintf(
self::SVN_PATH . ' commit %s %s -m %s',
$this->getCliCredentials(),
implode(' ', $toCommit),
escapeshellarg($msg)
), $desc, $pipes);

if (is_resource($proc)) {

if ($out = stream_get_contents($pipes[1])) {
    file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' out: ' . print_r($out, true) . PHP_EOL, FILE_APPEND | LOCK_EX);
}
fclose($pipes[1]);


if ($err = stream_get_contents($pipes[2])) {
    file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' err: ' . print_r($err, true) . PHP_EOL, FILE_APPEND | LOCK_EX);
}
fclose($pipes[2]);

// You can also check the process exit status
// 0 means success, otherwise error.
$exit_status = proc_close($proc);
file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' exit status: ' . print_r($exit_status, true) . PHP_EOL, FILE_APPEND | LOCK_EX);
}

 

Добавить комментарий
    как минимум 5 символов

    icon Вход в систему

    зарегистрироваться
    НОВЫЕ ПОЛЬЗОВАТЕЛИ