]> granicus.if.org Git - php/commit
Fixed bug #51800 proc_open on Windows hangs forever
authorAnatol Belski <ab@php.net>
Mon, 29 Sep 2014 14:24:34 +0000 (16:24 +0200)
committerAnatol Belski <ab@php.net>
Mon, 29 Sep 2014 14:24:34 +0000 (16:24 +0200)
commit0c982798e01e5a48765aa5352f96066e77e36efd
tree79c92a4b96a4c815ddcdfde37e36e460ee029437
parentef39f4044590c15c0d2d5437fc8ff147ff6156ad
Fixed bug #51800 proc_open on Windows hangs forever

This loop can block for some minutes, theoretically. Practially
however, this is a 99% non issue for a normal use case. This is
required because read() is synchronous. The PHP streams API wants
to fill its internal buffers, therefore it might try to read some
more data than user has demanded. Also, for a case where we want
to read X bytes, but neither enough data nor EOF arrives, read()
will block until it could fill the buffer. If a counterpart station
runs slowly or delivers not all the data at once, read() would
still be waiting. If we quit too early, we possibly could loose
some data from the pipe. Thus it has to emulate the read()
behaviour, but obviously not completely, just to some grade.

Reading big data amount is for sure an issue on any platforms, it
depends on the pipe buffer size, which is controlled by the system.
On Windows, the buffer size seems to be way too small, which causes
buffer congestion and a dead lock. It is essential to read the pipe
descriptors simultaneously and possibly in the same order as the
opposite writes them.

Thus, this will work with smaller buffer data sizes passed through
pipes. As MSDN states, anonymous pipes don't support asynchronous
operations. Neither anonymous pipes do support select() as they are
not SOCKETs but file descriptors. Consequently - bigger data sizes
will need a better solution based on threads. However it is much
more expencive. Maybe a better solution could be exporting a part
of the internal doing as a userspace function which could perform
some kind of lookahead operation on the pipe descriptor.

This is just the first stone, depending on the user feedback we
might go for further improvements in this area.
NEWS
ext/standard/tests/streams/proc_open_bug51800.phpt [new file with mode: 0644]
ext/standard/tests/streams/proc_open_bug51800_right.phpt [new file with mode: 0644]
ext/standard/tests/streams/proc_open_bug60120.phpt [new file with mode: 0644]
ext/standard/tests/streams/proc_open_bug64438.phpt [new file with mode: 0644]
main/streams/plain_wrapper.c