> So what's the ultimate goal? Do we want to do try to move away from the
> sockets extension? Or should we maintain the status quo (broad support for
> standard use-cases with the extension there if you need more)?

After consideration, I think I tend towards the latter - bringing the more
complex operations into the streams extension would create a lot of noise
that would likely irritate many users (let's be honest, socket programming
is not something the average PHP dev regularly does).

But I *would* like to see more readily available access to the sockets
extension, although I'm not sure what could be done about this - if I were
to suggest that they be enabled by default would everyone recoil in horror?
I suspect they might, but personally I don't see a solid reason for
requiring users to enable them manually.

And if that were to happen, or even if not, could we look at deprecating
fsockopen()/pfsockopen()? These genuinely are just old, less flexible
duplications of stream_socket_client(), which is enabled by default.

Cheers, Chris

On 6 September 2013 14:03, Daniel Lowrey <rdlow...@gmail.com> wrote:
> This is a reasonable point. Personally I'd prefer to have as much socket
> functionality as possible available natively without an extension. More
> discussion is probably necessary on this point, though.
>
> So what's the ultimate goal? Do we want to do try to move away from the
> sockets extension? Or should we maintain the status quo (broad support for
> standard use-cases with the extension there if you need more)? If it's the
> latter I'm not sure `stream_socket_listen()` is actually necessary. If we
> want to keep ext/sockets around for non-trivial use-cases then adding
> one-off stream functions like this might only serve to muddy the waters and
> create bloat.
>
> Also ...
>
>> For instance, the API is likely to get messy if you start trying to
>> set arbitrary options on a socket before binding.
>
> I'm not sure consistent cross-OS socket support will ever be anything but
> messy (internally), which is a big part of why a uniform API would be
> useful.
>
>
> On Fri, Sep 6, 2013 at 8:47 AM, Chris Wright <daveran...@php.net> wrote:
>>
>> I'm generally agreed with everything said below by everyone - but Wez's
>> message has
>> caused me to wonder whether it might be worth simply creating
>> stream_import_socket()
>> instead.
>>
>> Yes, the sockets extension is not always available, but I would suggest
>> that
>> any
>> instance that needs something that streams cannot currently provide is
>> likely to be
>> an instance over which the developer has more control (anyone trying to
>> listen for
>> connections on shared hosting is going to run into more roadblocks than
>> just
>> a lack
>> of the sockets ext, for example).
>>
>> Equally, it's nice to be able to treat a socket as a generic stream, and I
>> wouldn't
>> want this functionality to disappear or become harder to use.
>>
>> As it stands, there is currently quite a bit of duplicated functionality -
>> I
>> think
>> that a line needs be drawn that defines which extension is responsible for
>> what
>> i.e. leave the trivial stuff to streams and anything more advanced - I saw
>> multicast being banded about below - to the sockets extension. For
>> instance,
>> the
>> API is likely to get messy if you start trying to set arbitrary options on
>> a
>> socket before binding.
>>
>> That said, I'm have no actual objection to Daniel's patch, and I too would
>> like to
>> see a stream_socket_set_option() or similar.
>>
>> My $0.02
>>
>> Thanks, Chris
>>
>> -----Original Message-----
>> From: Daniel Lowrey [mailto:rdlow...@gmail.com]
>> Sent: 06 September 2013 06:24
>> To: Wez Furlong
>> Cc: internals@lists.php.net; Sara Golemon
>> Subject: [PHP-DEV] Re: New function: stream_socket_listen()
>>
>> Hi! I'm with you @Wez -- allowances for assigning common socket options
>> would be a major win. I'll see what I can do about working on something
>> more
>> robust than this one-off function PR.
>>
>> On Friday, September 6, 2013, Wez Furlong wrote:
>>
>> > 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/bcbf02e1a70d0dba86564480c63f5
>> > d6596658815/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<javascript:_e({}, 'cvml', '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<javascript:_e({}, 'cvml', '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
>> >>>
>> >>
>> >>
>> >
>>
>

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

Reply via email to