Я попытался получить выход из метода proc_open
в php, но, когда я его распечатаю, я получил пустой.
$ descriptorspec = array ( 0 => array ("pipe", "r"), 1 => массив ("труба", "w"), 2 => массив («файл», «файлы / temp / error-output.txt», «a») ); $ process = proc_open («время ./a a.out», $ descriptorspec, $ pipes, $ cwd);
если я знаю, я могу получить вывод с помощью stream_get_contents()
echo stream_get_contents ($ pipes [1]); fclose ($ труб [1]);
Но я не могу этого сделать .. любое предложение?
Thx до …
Ваш код более или менее работает для меня. time
выводит свой вывод на stderr
поэтому, если вы ищете этот вывод, загляните в файлы files/temp/error-output.txt
. Труба stdout
$pipes[1]
будет содержать только выход программы ./a
.
Мой репродуктор:
[edan@edan tmp]$ cat proc.php <?php $cwd='/tmp'; $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", "/tmp/error-output.txt", "a") ); $process = proc_open("time ./a a.out", $descriptorspec, $pipes, $cwd); echo stream_get_contents($pipes[1]); fclose($pipes[1]); ?> [edan@edan tmp]$ php proc.php a.out here. [edan@edan tmp]$ cat /tmp/error-output.txt real 0m0.001s user 0m0.000s sys 0m0.002s
это еще один пример с proc_open()
. В этом примере я использую команду Win32 ping.exe. CMIIW
set_time_limit(1800); ob_implicit_flush(true); $exe_command = 'C:\\Windows\\System32\\ping.exe -t google.com'; $descriptorspec = array( 0 => array("pipe", "r"), // stdin 1 => array("pipe", "w"), // stdout -> we use this 2 => array("pipe", "w") // stderr ); $process = proc_open($exe_command, $descriptorspec, $pipes); if (is_resource($process)) { while( ! feof($pipes[1])) { $return_message = fgets($pipes[1], 1024); if (strlen($return_message) == 0) break; echo $return_message.'<br />'; ob_flush(); flush(); } }
Надеюсь, это поможет =)