php利用Streams扩展来写server

1:一个最简单的tcp服务

$socket = stream_socket_server("tcp://0.0.0.0:1215", $errno, $errstr);
if (!$socket) {
    echo "$errstr ($errno)<br />\n";
} else {
    while ($conn = stream_socket_accept($socket)) {
        fwrite($conn, 'The local time is ' . date('Y-m-d H:i:s) . "\r\n");
        fclose($conn);
    }
    fclose($socket);
}

2:一个最简单的udp服务

$socket = stream_socket_server("udp://127.0.0.1:1215", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
    die("$errstr ($errno)");
}
do {
    $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
    echo "$peer\r\n";
    stream_socket_sendto($socket,'The local time is ' . "\r\n", 0, $peer);
} while ($pkt !== false);

3:一个简单的http服务

$server = stream_socket_server('tcp://0.0.0.0:1215', $errno, $errstr);

while(true)
{
    $buffer = '';
    print "waiting...";
    $client = stream_socket_accept($server);
    print "accepted " . stream_socket_get_name( $client, true) . "\n";
    if( $client )
    {
        $buffer .= fread($client, 1024);
        // Respond to client
        fwrite($client,  "HTTP/1.1 200 OK\r\n"
                . "Connection: close\r\n"
                . "Content-Type: text/html\r\n"
                . "\r\n"
                . "Hello World! " . microtime(true)
                . "<pre>{$buffer}</pre>");
        fclose($client);

    } else {
        print "error.\n";
    }
}

4:一个简单的https服务

<?php

$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'local_cert', 'test.pem');
stream_context_set_option($context, 'ssl', 'local_pk', 'test.key');
stream_context_set_option($context, 'ssl', 'allow_self_signed',true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);
$server = stream_socket_server('ssl://0.0.0.0:1215', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);

while(true)
{
    $buffer = '';
    print "waiting...";
    $client = stream_socket_accept($server);
    print "accepted " . stream_socket_get_name( $client, true) . "\n";
    if( $client )
    {
        $buffer .= fread($client, 2046);
        // Respond to client
        fwrite($client,  "HTTP/1.1 200 OK\r\n"
            . "Connection: close\r\n"
            . "Content-Type: text/html\r\n"
            . "\r\n"
            . "Hello World! " . microtime(true)
            . "<pre>{$buffer}</pre>");
        fclose($client);
    } else {
        print "error.\n";
    }
}

5:用select事件来做服务

$master = array();
$socket = stream_socket_server("tcp://0.0.0.0:1215", $errno, $errstr);
if (!$socket) {
    echo "$errstr ($errno)<br />\n";
} else {
    $master[] = $socket;
    $read = $master;
    while (1) {
        $read = $master;
        $mod_fd = @stream_select($read, $_w = NULL, $_e = NULL, 10);
        echo date("Y-m-d H:i:s")."stream_select\r\n";
        if ($mod_fd === FALSE) {
            break;
        }
        for ($i = 0; $i <= $mod_fd; $i++) {
            if ( is_resource($read[$i]) ){
                echo $i." is  resource \r\n";
                if ($read[$i] === $socket) {
                    $conn = stream_socket_accept($socket);
                    fwrite($conn, "Welcome Hello! The time is ".date("Y-m-d H:i:s")."\n");
                    $master[] = $conn;
                } else {
                    $sock_data = fread($read[$i], 2048);
                    if (strlen(trim($sock_data),"\n") === 0) { // connection closed
                        echo "connection closed\n";
                        $key_to_del = array_search($read[$i], $master, TRUE);
                        fclose($read[$i]);
                        unset($master[$key_to_del]);
                        exit;
                    } else if ($sock_data === FALSE) {
                        echo "Something bad happened";
                        $key_to_del = array_search($read[$i], $master, TRUE);
                        unset($master[$key_to_del]);
                        exit;
                    } else {
                        $str = "The client has sent :".trim($sock_data,"\n")."\n";
                        fwrite($read[$i], $str);
                        fclose($read[$i]);
                        unset($master[array_search($read[$i], $master)]);
                    }
                }
            }else{
                echo $i." is not resource \n";
            }
        }
    }
}

简单用stream扩展写了几个例子,其实它的功能可以扩展到很强大的功能。

此条目发表在 好文推荐, 网站开发 分类目录,贴了 标签。将固定链接加入收藏夹。

评论功能已关闭。