If you want to make a daemon process that forks on each client connection, you'll find out that there's a bug in PHP. The child processes send SIGCHLD to their parent when they exit but the parent can't handle signals while it's waiting for socket_accept (blocking).
Here is a piece of code that makes a non-blocking forking server.
#!/usr/bin/php -q
<?php
$__server_listening = true;
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
declare(ticks = 1);
become_daemon();
change_identity(65534, 65534);
pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGINT, 'sig_handler');
pcntl_signal(SIGCHLD, 'sig_handler');
server_loop("127.0.0.1", 1234);
function change_identity( $uid, $gid )
{
    if( !posix_setgid( $gid ) )
    {
        print "Unable to setgid to " . $gid . "!\n";
        exit;
    }
    if( !posix_setuid( $uid ) )
    {
        print "Unable to setuid to " . $uid . "!\n";
        exit;
    }
}
function server_loop($address, $port)
{
    GLOBAL $__server_listening;
    if(($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        echo "failed to create socket: ".socket_strerror($sock)."\n";
        exit();
    }
    if(($ret = socket_bind($sock, $address, $port)) < 0)
    {
        echo "failed to bind socket: ".socket_strerror($ret)."\n";
        exit();
    }
    if( ( $ret = socket_listen( $sock, 0 ) ) < 0 )
    {
        echo "failed to listen to socket: ".socket_strerror($ret)."\n";
        exit();
    }
socket_set_nonblock($sock);
    echo "waiting for clients to connect\n";
    while ($__server_listening)
    {
$connection = @socket_accept($sock);
        if ($connection === false)
        {
usleep(100);
        }elseif ($connection > 0)
        {
handle_client($sock, $connection);
        }else
        {
            echo "error: ".socket_strerror($connection);
            die;
        }
    }
}
function sig_handler($sig)
{
    switch($sig)
    {
        case SIGTERM:
        case SIGINT:
            exit();
        break;
        case SIGCHLD:
pcntl_waitpid(-1, $status);
        break;
    }
}
function handle_client($ssock, $csock)
{
    GLOBAL $__server_listening;
$pid = pcntl_fork();
    if ($pid == -1)
    {
echo "fork failure!\n";
        die;
    }elseif ($pid == 0)
    {
$__server_listening = false;
socket_close($ssock);
interact($csock);
socket_close($csock);
    }else
    {
socket_close($csock);
    }
}
function interact($socket)
{
}
function become_daemon()
{
$pid = pcntl_fork();
    if ($pid == -1)
    {
echo "fork failure!\n";
        exit();
    }elseif ($pid)
    {
exit();
    }else
    {
posix_setsid();
chdir('/');
umask(0);
        return posix_getpid();
    }
}
?>