On 10-Dec-07, at 5:20 PM, Jim Lucas wrote:

Tom Rogers wrote:
Hi,

Tuesday, December 11, 2007, 6:42:18 AM, you wrote:
RF> Hello,

Put a usleep(1000) in the listen while() loop and give the cpu a
break.


This makes me think about asking if you have to short of a timeout on your receiving connection?

One second on stream_socket_server(), with a 900 second timeout stream_socket_accept().

What are you using to setup your connection? fsockopen() or stream_socket_server() ?

here is a snippet of what I have
[...]

Thanks for sharing your code. Seems pretty similar to mine at first glance.

I don't have a timeout set on the *_recvfrom() call. I just wait until the next connection comes in.

You don't need to use mysql_pconnect(), especially if you are using, what in essence is, a daemon.

Yeah, after thinking about it, that's what I figured. Thanks for confirming though.

Just don't open and close the connection constantly, leave it open.

Yes, I just open it once at the top of the script. And that's it.

Also, make sure you are not using an array that you are not re- initializing through each iteration of the loop. If the array keeps getting bigger, PHP might $*%& on itself. Always re-initialize
arrays to clean them up.

Hope some of this helps!

All good advice. I will check my arrays, although I don't think this is a problem since I monitor the scripts memory usage with memory_get_usage() and memory_get_peak_usage(), and it never tops 3MB (max allocated is 16MB). There are a few little parts to the daemon. One thing I'm doing that could be problematic is running an include (); on a couple files each time a socket has new data (this allows me to adjust the processing logic on the fly without having to start the script and wait for clients to reconnect)--but I can see this being expensive in terms of performance and resources. Actually, I wonder if THAT is not what's starving the script of resources over time-- each fread() involves several includes(); I'll have to look into that...

FWIW, here's the stripped-down skeleton of the server:
As always, constructive criticism is very welcome.

<?php

$socket = stream_socket_server("tcp://127.0.0.1:9876", $errno, $errstr);

if ($socket) {
        
        $master[] = $socket;
        $read = $master;
        $write = $master;                       

        while (1) {
        
                $read = $master;
                $write = $master;                       
                $mod_fd = stream_select($read, $_w = NULL, $_e = NULL, 1);

                if ($mod_fd === FALSE) {
                        break;
                        }
                        
                for ($i = 0; $i < $mod_fd; ++$i) {
                        if ($read[$i] === $socket) {            // NEW SOCKET

                                $conn = stream_socket_accept($socket, 900);
                                $master[] = $conn;
                                $key_num = array_search($conn, $master, TRUE);
                                
                                } else {

                                $sock_data = fread($read[$i], 32768);
                                
                                if (strlen($sock_data) === 0) {         // 
CONNECTION GONE
                                
                                        $key_to_del = array_search($read[$i], 
$master, TRUE);
                                        fclose($read[$i]);      
                                        unset($master[$key_to_del]);
                                        
                                        } elseif ($sock_data === FALSE) {       
// CONNECTION BROKEN
                                        
                                        $key_to_del = array_search($read[$i], 
$master, TRUE);
                                        fclose($read[$i]);
                                        unset($master[$key_to_del]);

                                        } else {                                
                        // READ INCOMING DATA
                                                                                
                                        // include (somefiles);
                                        // include (somefiles);
                                        // include (somefiles);
                                        // [ ... ]

                                        }
                                }
                        }
                }
        }

?>

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to