Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:68903 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 73901 invoked from network); 6 Sep 2013 05:23:55 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 6 Sep 2013 05:23:55 -0000 Authentication-Results: pb1.pair.com header.from=rdlowrey@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=rdlowrey@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.223.181 as permitted sender) X-PHP-List-Original-Sender: rdlowrey@gmail.com X-Host-Fingerprint: 209.85.223.181 mail-ie0-f181.google.com Received: from [209.85.223.181] ([209.85.223.181:47484] helo=mail-ie0-f181.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 62/E1-56379-AE669225 for ; Fri, 06 Sep 2013 01:23:55 -0400 Received: by mail-ie0-f181.google.com with SMTP id y16so632036ieg.26 for ; Thu, 05 Sep 2013 22:23:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=cU+/VPfA6uBhJwK8CiP6W3sIHmPktBrYOQrXRds1acw=; b=GBRVL/KhRfM1M6npDosJmS9+5dg93IhbKqnAZxSCzitJcgzIjd1ukTgg5KfovFrffw yF9Zb+GqoJThkgU0x2itUofaxazupl1iiWKTkzY1uEzPX4nTQ5kwqkbN1/qKR2BfMzA2 dWzpy1pax8LjhxcZlbua62HauJldXUiiNjgqWivC3fRCLSi1sGfImxTTa1j3ni6gPEW1 E0SRuoSa1pzyQOjTRthAR8H/vfn6HwAKlA/sUDSooOaILVnLQ/yhUzr3cVN8xZH2JVc1 5QbbaUb35yP1ngGEG+qRPumNskORel3AcjsvpQWLH/VtaBsI+RvjzkdNtLQyclIqjpFI XG+w== MIME-Version: 1.0 X-Received: by 10.50.26.36 with SMTP id i4mr403405igg.33.1378445031529; Thu, 05 Sep 2013 22:23:51 -0700 (PDT) Received: by 10.50.157.199 with HTTP; Thu, 5 Sep 2013 22:23:51 -0700 (PDT) In-Reply-To: References: Date: Fri, 6 Sep 2013 01:23:51 -0400 Message-ID: To: Wez Furlong Cc: "internals@lists.php.net" , Sara Golemon Content-Type: multipart/alternative; boundary=047d7bd76fe072707904e5b03e8e Subject: Re: New function: stream_socket_listen() From: rdlowrey@gmail.com (Daniel Lowrey) --047d7bd76fe072707904e5b03e8e Content-Type: text/plain; charset=ISO-8859-1 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/bcbf02e1a70d0dba86564480c63f5d6596658815/upnp-srv/couchshare.c?at=default > for setting multicast options. > > Thanks! > > --Wez. > > > > On Thu, Sep 5, 2013 at 12:10 PM, Sara Golemon > > 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 >> > 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 >>> >> >> > --047d7bd76fe072707904e5b03e8e--