В PHP функция exec() выполняет команду и возвращает выходные данные из стандартного вывода команды. Однако, если команда записывает в поток stderr, этот вывод не захватывается функцией exec().
Чтобы захватить как стандартный вывод, так и стандартный вывод из команды, вы можете использовать функцию proc_open(). proc_open() обеспечивает более высокий уровень контроля над процессом выполнения команды, включая возможность передачи потоков команды stdin, stdout и stderr.
Пример:
Давайте рассмотрим следующий сценарий оболочки test.sh, который записывает данные как в stderr, так и в стандартный вывод:
#!/bin/bash echo 'this is on stdout'; echo 'this is on stdout too'; echo 'this is on stderr' >&2; echo 'this is on stderr too' >&2;
Чтобы выполнить этот скрипт на PHP и захватить как стандартный вывод, так и стандартный вывод, вы можете использовать следующий код:
$descriptorspec = [ 0 => ['pipe', 'r'], // stdin 1 => ['pipe', 'w'], // stdout 2 => ['pipe', 'w'], // stderr ]; $process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); echo "stdout : \n"; var_dump($stdout); echo "stderr :\n"; var_dump($stderr);
Вывод:
Когда вы выполните приведенный выше PHP-скрипт, вы получите следующий вывод:
stdout : string(40) "this is on stdout this is on stdout too" stderr : string(40) "this is on stderr this is on stderr too"
Вывод показывает потоки stdout и stderr из сценария test.sh.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3