实现一个HTTP服务器时,每个申请开一个协程解决,解决完申请后销毁,让咱们优化这段逻辑,咱们很容易联想到FASTCGI比照CGI的改良。无非就是事后生成几个worker过程,解决实现后不销毁复用嘛。

那协程也是同理,为了不便演示,只开一个协程,便于了解。

一个申请一个协程:

<?phpCo::set(['hook_flags'=> SWOOLE_HOOK_ALL]);use function Co\run;run(function () {    $socket = stream_socket_server(        'tcp://0.0.0.0:9998',        $errno,        $errstr    );    if (!$socket) {        echo "$errstr ($errno)" . PHP_EOL;        exit(1);    }    while (true) {        $conn = stream_socket_accept($socket);        if ($conn) {            go(function() use ($conn) {                fwrite($conn, "HTTP/1.1 200 OK\r\nContent-Length:11\r\n\r\nHello!world");            });        }    }});

协程复用:

<?phpCo::set(['hook_flags'=> SWOOLE_HOOK_ALL]);use Co\Channel;use function Co\run;run(function () {    $channel = new Channel(1);    go(function() use ($channel) {        while (($conn = $channel->pop()) !== false) {            fwrite($conn, "HTTP/1.1 200 OK\r\nContent-Length:11\r\n\r\nHello!world");        }    });    $socket = stream_socket_server(        'tcp://0.0.0.0:9999',        $errno,        $errstr    );    if (!$socket) {        echo "$errstr ($errno)" . PHP_EOL;        exit(1);    }    while (true) {        $conn = stream_socket_accept($socket);        if ($conn) {            $channel->push($conn);        }    }});

事实中,咱们不会只开一个协程,下次有工夫再来撸一个协程池,实现getWorkerputWorker,反对协程池动静扩容。

感激https://github.com/panjf2000/ants我的项目的启发。