Re: Re: Sockets Extension Rework (API, etc...) VERY LONG
| From: | J Smith | Date: | Fri, 22 Feb 2002 15:17:24 +0000 |
| Subject: | Re: Re: Sockets Extension Rework (API, etc...) VERY LONG | ||
| References: | 1 2 3 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-80303@lists.php.net to get a copy of this message | ||
Coo. I never really got into the rationale behind the C API, all that
kernel optimization, which is interesting. I haven't had any problems yet
with fd_clear, but I don't use it intensely. (Once, maybe twice in a
script.)
Anyways, anything that will make the extension better is a good thing. (I'm
just glad it won't take much to fix existing code to work with the changes.)
J
Jason Greene wrote:
>
>
> Well, since you know the C-API, lets look at if from the C socket API
> perspective. select() is designed to take 3 arrays. The problem with
> arrays is that they take up memory and processing time. In application
> space this really isn't a problem, but in the kernel, every saved byte
> counts. To optimize this they emulated arrays using bit masks. Another
> optimization they performed is to have you pass the highest file
> descriptor + 1 into select. (that way they only process part of the bit
> mask.)
>
>
> What I am getting at, is that FD_* was an interface designed strictly
> for kernel performance. Direct manipulation of these low level values
> does not really belong in a high-level language.
>
> The method that makes the most sense is to use php arrays in place of
> the fd masks. Everything would work exactly the same, except it would be
> much easier to interface, it would be less buggy, and require less code.
>
> By the way, the bug with the socket_fd_functions, is that it may set
> your maximum file descriptor incorrectly, and this would cause you to
> miss events occurring on ready sockets. (This occurs anytime you call
> socket_fd_clear() on a socket, or if you don't add sockets in order they
> were opened ex. 3, 1, 2 will cause you to lose file descriptor 3.
>
>
> example
> --------
>
> <?php
>
> // ...
>
> $read_flds=array($socket1, $socket2, $socket3, $socket4, $socket5);
> $write_flds=array($socket6, $socket7, $socket8);
> $except_flds=array($socket9);
>
>
> // Wait on sockets specified in arrays, and modify them to contain
> // sockets that are ready
> $retval = socket_select($read_flds, $write_flds, $except_flds, 1);
>
> //Perform actions on sockets waiting to be read
> foreach($read_flds as $read_sock)
> perform_read_action($read_sock);
>
> //Perform actions on sockets waiting to be written
> foreach($write_flds as $write_sock)
> perform_write_action($write_sock);
>
> //Perform actions on exceptions
> foreach($except_flds as $except_sock)
> process_exception($except_sock);
>
>
> // ...
>
> ?>
>
>
> I would like to see this extension become stable so that people can
> start relying on somewhat frozen behavior.
>
> To answer your question It should be pretty easy to port your code to
> the newer API.
>
>
> I appreciate hearing concerns like this, and I hope you and others
> continue to speak up. : )
>
> -Jason
>