Questions like this should be posted to php.general, not php.dev -- php.dev is for developing PHP itself; php.general is for developing WITH PHP.
That aside, attached is a simple example of setting up a multiplexer with socket_select(). The example creates a [very] small chat server -- just start up the server and try connecting with telnet to localhost on port 10000 with a couple of terminals. You should be able to send messages from terminal to terminal. Note that the example doesn't do a lot of error checking, and is pretty hacked together and not too pretty. But it's a decent example. J Gustavo Almeida wrote: > Dear php-dev, > > Hi, I'm here again with another doubt. Now, I know that I have to > use socket_select() before the socket_accept(), but what I can't > understand is how to "store" or handle many clients yet, my app > has a lot of socket_write() and socket_read() functions, and > intaction with DB (Postgres), I guess am I a little confuse, > anybody help? >
<?php set_time_limit(0); define("MAX_CLIENTS", 10); // the $listener socket doesn't actually serve // clients, it only listens for connections and // hands them off to the $client array below. $listener = socket_create(AF_INET, SOCK_STREAM, 0); socket_setopt($listener, SOL_SOCKET, SO_REUSEADDR, 1); socket_bind($listener, "0.0.0.0", 10000); socket_listen($listener); // $client will hold our clients while they're connected... $client = array(); while (1) { // these next lines set up our clients and our // listener socket for reading... $read[0] = $listener; for ($i = 0; $i < MAX_CLIENTS; $i++) { if ($client[$i] != null) $read[$i + 1] = $client[$i]; } // now a blocking call to socket_select(). This will // wait forever until a connection is received. $nready = socket_select($read, $null, $null, null); // if a new connection is being made, accept it and // put it into the client array... if (in_array($listener, $read)) { for ($i = 0; $i < MAX_CLIENTS; $i++) { if ($client[$i] == null) { $client[$i] = socket_accept($listener); break; } else if ($i == MAX_CLIENTS - 1) trigger_error("too many clients", E_USER_ERROR); } if (--$nready <= 0) continue; } // if we have clients that are trying to write // to the server, handle them now... for ($i = 0; $i < MAX_CLIENTS; $i++) { if (in_array($client[$i], $read)) { $n = trim(socket_read($client[$i], 1024)); socket_getpeername($client[$i], $host, $port); if ($n) { for ($j = 0; $j < MAX_CLIENTS; $j++) { if ($client[$j]) socket_write($client[$j], "From $host:$port: $n\n\r"); } } else { for ($j = 0; $j < MAX_CLIENTS; $j++) { if ($client[$j]) socket_write($client[$j], "Disconnecting $host:$port\n\r"); } socket_close($client[$i]); unset($client[$i]); } } } } ?>
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php