Here is a very simple example socket server, using the concepts discussed in this tutorial.

<?php

set_time_limit(0);

define('LINESIZE', 1024);
define('PORT', 1053);    
define('MAXCLIENTS', 5); 

function killDaemon()
{
    global $listenfd, $client;

    socket_close($listenfd);

    $msg = "Shutting Down...\n";
    $msg_len = strlen ($msg);

    for ($i = 0; $i < MAXCLIENTS; $i++) {
        if ($client[$i] != null) {
            socket_write($client[$i], $msg, $msg_len);
            socket_close($client[$i]);
        }
    }

    exit();
}

function closeClient($i)
{
    global $client, $remote_host, $remote_port;
    
    socket_close($client[$i]);
    $client[$i] = null;
    unset($remote_host[$i]);
    unset($remote_port[$i]);
}


$listenfd = socket_create (AF_INET, SOCK_STREAM, 0);
if (! $listenfd) {
    die ("Couldn't create socket!");
}

socket_set_option ($listenfd, SOL_SOCKET, SO_REUSEADDR, 1);

if (!socket_bind ($listenfd, "0.0.0.0", PORT)) {
    socket_close ($listenfd);
    die ('Cannot bind to port ' . PORT . " and address 0.0.0.0\n");
}

socket_listen ($listenfd, 10);

$maxi = -1;
for ($i = 0; $i < MAXCLIENTS; $i++) {
    $client[$i] = null;
}

while(1) {
    $rfds[0] = $listenfd;

    for ($i = 0; $i < FD_SETSIZE; $i++) {
        if ($client[$i] != null) {
            $rfds[$i + 1] = $client[$i];
        }
    }


    $nready = socket_select($rfds, $null, $null, null);
    if (in_array($listenfd, $rfds)) {
        for ($i = 0; $i < FD_SETSIZE; $i++) {
            if ($client[$i] == null) {
                $client[$i] = socket_accept($listenfd);
                socket_set_option ($client[$i], 
                                   SOL_SOCKET, SO_REUSEADDR, 
                                   1);
                socket_getpeername($client[$i], 
                                   $remote_host[$i], 
                                   $remote_port[$i]);
                break;
            }

            if ($i == FD_SETSIZE - 1) {
                trigger_error("too many clients", E_USER_ERROR);
                exit ();
            }
        }

        if ($i > $maxi) {
            $maxi = $i;
        }

        if (--$nready <= 0) {
            continue;
        }
    }


    // check the clients for incoming data.

    for ($i = 0; $i <= $maxi; $i++) {
        if ($client[$i] == null)
            continue;

        if (in_array($client[$i], $rfds)) {
            $n = trim(socket_read($client[$i], LINESIZE));

            if (!$n) {
                closeClient($i);
            } else {
                switch ($n) {
                case '/kill':
                    killDaemon();
                    break;
                case '/quit':
                    closeClient($i);
                    break;
                default:
                    for ($j = 0; $j <= $maxi; $j++) {
                        if ($client[$j] != null) {
                            socket_write($client[$j], 
                                         "From client[$i]: $n\r\n");
                        }
                    }
                    break;
                }
            }

            if  (--$nready <= 0) {
                break;
            }
        }
    }
}

/**
 * Local Variables:
 * c-basic-offset: 4
 * tab-width: 4
 * End:
 */

?>