I worked with proc_open for a while before realizing how it works with applications in real time.
This example loads up the eDonkey2000 client and reads data from it and passes in various commands and returns the results.
This is the base for an ncurses gui for edonkey I am writing in PHP.
<?
define ("DASHES", "-------------------------------------------------\n");
function readit($pipes, $len=2, $end="> "){
stream_set_blocking($pipes[1], FALSE);
while($ret = fread($pipes[1],$len)){
$retval .= $ret;
if(substr_count($ret, $end) > 0){ $pipes[1] = "" ; break;}
}
return $retval;
}function sendto($pipes, $str){
fwrite($pipes[0], $str."\n");
}function viewopts($pipes, $opt){
sleep(1);
sendto($pipes, $opt);
return readit($pipes);
}function sendopts($pipes, $opt){
sendto($pipes, $opt);
usleep(50);
return readit($pipes);
}$dspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file", "/tmp/eo.txt", "a"),);
$process = proc_open("donkey", $dspec, $pipes);
if (is_resource($process)) {
readit($pipes);
echo DASHES;
echo viewopts($pipes, "vo");
echo DASHES; echo SEP;echo DASHES;
echo sendopts($pipes, "name test".rand(5,5000));
echo DASHES; echo SEP; echo DASHES;
echo viewopts($pipes, "vo");
echo DASHES; echo SEP; echo DASHES;
echo sendopts($pipes, "temp /tmp");
echo DASHES; echo SEP; echo DASHES;
echo viewopts($pipes, "g");
echo DASHES;
sendto($pipes, "q");
sendto($pipes, "y");
readit($pipes);
fclose($pipes[0]);
fclose($pipes[1]);
$return_value = proc_close($process);
}
?>
returns what looks like the following
-----------------------------------------------------------------
Name: test2555
AdminName: admin
AdminPass: password
AdminPort: 79
Max Download Speed: 0.00
Max Upload Speed: 0.00
Line Speed Down: 0.00
Door Port: 4662
AutoConnect: 1
Verbose: 0
SaveCorrupted: 1
AutoServerRemove: 1
MaxConnections: 45
> ----------------------------------------------------------------