Hi,

regarding the mentioned tickets I've prepared a patch
https://github.com/php/php-src/compare/master...weltling:pipe_blocking_win .
Anonymous pipes on Windows 

- don't support asynchronous IO
- don't support select()
- have buffer size of 4096 bytes (or even less) which is much easier
overflown that a buffer of 64kb often to be seen on Unix

These issues was addressed last year, but the tickets mentioned report about
the issues still persisting in PHP5/7. While it's likely a no go for PHP5, I
would like to push this patch into PHP7. Particularly what it does is
allowing the blocking read() again for the edge cases reported in the listed
tickets. It is done adding a context option and a new win only option for
proc_open. Just to illustrate a few - 

==== SNIPPET ====
/* here proc_open() will do a blocking read on the child process*/
$process = proc_open(PHP_BINARY.' -f ' . $fl, $descriptorspec, $pipes, NULL,
NULL, array("blocking_pipes" => true));
==== END SNIPPET ====

==== SNIPPET ====
$in = fopen("php://stdin", "rb", false, stream_context_create(array("pipe"
=> array("blocking" => true))));
+while(!feof($in)){ /* here feof() will do a blocking read on the pipe */
........................
==== END SNIPPET ====

The only drawback on this is that blocking reads on pipes are likely to
cause pipe buffer overflows and thus deadlock, like it was before. Though,
when working with them carefully, this could be avoided and would bring
improvements with several edge cases, almost when working on CLI. Anyway
this patch brings no difference to PHP5 while addressing those edge cases.

I would like to ask for review here. I've also made a minimal build with
this patch http://windows.php.net/downloads/snaps/ostc/69900/ for those
interested to test. If there are no strong objections, it should be merged
soon.

Thanks

Anatol


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to