I'm not opposed to the idea; the reason that I didn't implement it
initially is that I wanted something functional in the core (ext/sockets
was often not available) and we didn't have "PHP Spirit" equivalents of the
various and murky socket option setting APIs that are present in
ext/sockets (it's not the most intuitive interface even for C developers).

So we got an implementation that does what you want for most cases; bind
and listen in one step.

I won't block this patch, but it would be /really/ great if you could
follow-on with a diff to allow setting the most commonly used socket
options (plus SO_REUSEPORT, since you mentioned it) and also a function to
allow setting CLOEXEC (perhaps stream_set_cloexec(bool)), which is
something I wish I'd added back when I put this stuff together!

You win super extra crazy bonus points for allowing something like this
https://bitbucket.org/wez/couchshare/src/bcbf02e1a70d0dba86564480c63f5d6596658815/upnp-srv/couchshare.c?at=default
for setting multicast options.

Thanks!

--Wez.



On Thu, Sep 5, 2013 at 12:10 PM, Sara Golemon <poll...@php.net> wrote:

> Seems reasonable to me, but Wez should probably weigh in on it.  I vaguely
> recall a conversation with him when he first implemented stream_socket_*()
> and a reason why listen wasn't in the API.
>
> -Sara
>
>
> On Thu, Sep 5, 2013 at 10:30 AM, Daniel Lowrey <rdlow...@gmail.com> wrote:
>
>> The stream socket functions are incredibly useful and obviate the need for
>> the sockets extension for the vast majority of potential use-cases.
>> However, it's currently it's not possible bind a socket and listen for
>> connections in separate steps using stream_socket_server().
>>
>> This _can_ be done with the aid of ext/sockets like so:
>>
>> $stream = stream_socket_server('tcp://0.0.0.0:0', $errno, $errstr,
>> STREAM_SERVER_BIND);
>> $sock = socket_import_stream($stream);
>> socket_listen($sock);
>>
>> Why is this useful? Well, for example, binding to a port in the main
>> process and then listening individually in child forks/threads trivializes
>> scaling socket servers. By listening on the same bound socket in multiple
>> processes you get the advantage of the OS distributing new client
>> connections to the individual workers instead of routing them in userland.
>> Additionally, newer linux kernel versions (3.9x) now support the
>> SO_REUSEPORT socket option which only makes this functionality more
>> attractive. Admittedly you still need ext/sockets to reap the benefits of
>> SO_REUSEPORT, but this may not always be the case.
>>
>> My proposed patch adds a very simple function so that listening may be
>> decoupled from binding without the need for ext/sockets:
>>
>> $stream = stream_socket_server('tcp://0.0.0.0:0', $errNo, $errStr,
>> STREAM_SERVER_BIND);
>> // do stuff, fork, etc. Then in the child process:
>> stream_socket_listen($server);
>>
>> Existing functionality is not modified and there are no BC breaks. I.E.
>> you
>> can still bind + listen in a single step like before:
>>
>> $stream = stream_socket_server('tcp://0.0.0.0:0', $errNo, $errStr,
>> STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
>>
>> This addition seemed a bit trivial for an RFC, so and I didn't bother
>> hitting the wiki. The link to the relevant pull request follows. Any
>> thoughts, comments and opinions are welcome:
>>
>> https://github.com/php/php-src/pull/431
>>
>
>

Reply via email to