I have a certain command line program which takes in input from the stream and not as command line arguments.(For example, a C program that takes input using scanf.) How can I interact with this app using PHP? exec(), shell_exec() wont help here since input is not through command line arguments. I need a constant input/output connection between the PHP script and the command line program, so that the user can give PHP an input, which PHP will relay to the program and then get the output, which is displayed to the user.
Asked
Active
Viewed 1,833 times
1 Answers
2
You can use proc_open
for this.
Example from that page:
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);
$cwd = '/tmp';
$env = array('some_option' => 'aeiou');
$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) {
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
// Any error output will be appended to /tmp/error-output.txt
fwrite($pipes[0], '<?php print_r($_ENV); ?>');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
echo "command returned $return_value\n";
}
?>
Output:
Array
(
[some_option] => aeiou
[PWD] => /tmp
[SHLVL] => 1
[_] => /usr/local/bin/php
)
command returned 0

Dogbert
- 212,659
- 41
- 396
- 397