Hi, I've just committed my first bash at a bi-directional (and more) process pipe function. It also appears to work on Win32 (I've only done minimal testing).
The rationale, besides allowing reading and writing to a spawned process, is that redirecting the standard streams becomes more portable/shell independent. The example below is roughly equivalent to something like this in unix shell speak: output=$(echo "hello my child" | cat - 2>/path/to/file) but will also work under win32. Heres the synopsis: $descriptorspec = array( 0 => array("pipe", "r"), /* stdin for child is a readable pipe */ 1 => array("pipe", "w"), /* stdout for child is a writeable pipe */ 2 => array("file", "/path/to/file", "w"), /* stderr is a writeable file */ ); $command = "cat -"; // $handles is passed by reference $process = proc_open($command, $descriptorspec, $handles); // $process is a resource representing the child process // $handles is an array indexed by integer which holds file // handles for the parent side of any pipes passed to the child /* send some text to stdin of child */ fwrite($handles[0], "hello my child"); fclose($handles[0]); /* read all of the child stdout and display it */ fpassthru($handles[1]); fclose($handles[1]); // Although I'm using pclose to release $process here, // $process cannot be used with fread() etc. // I intend to have a proc_close function or alias. // I haven't implemented the return value fetching under win32 yet. $return_value = pclose($process); The $descriptorspec array is not limited to descriptors 0-3; any integer index file descriptor number can be passed. This should also work under win32, although win32 only really respects stdin/stdout/stderr - passing and using other descriptors should be possible by passing the win32 handle as an integer argument on the command line. We don't currently have a means to do this from PHP user-space; if anyone has suggestions on a nice way of doing this (perhaps using a simple sprintf-style expansion on the command string), please let me know. $descriptorspec can also accept PHP file handles as the array values, provided that the underlying stream can be cast into a file descriptor. Also, file based descriptors will try to open(2) the path before attempting to use URL wrappers (if enabled), which should save some time/memory overhead since files and pipes should be the most common usage. Also TODO is "2>&1" style syntax. Any feedback/comments are more than welcome, --Wez. -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php