许多请求后,PHP套接字服务器冻结

时间:2015-11-15 19:06:57

标签: php sockets http

我正在使用PHP套接字编写HTTP服务器,目前它正常工作但问题出现了然后我运行25级并发的apache基准测试和1000请求它只是冻结和超时,但是24并发级别它完全正常。也许有人会在我的架构中找出一个缺陷,因为我不认为这里的并发是一个问题,因为内核应该平衡一切。

这是我的最小可重现代码:

<?php


$server = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($server, '127.0.0.1', '9090');
socket_set_nonblock($server);
socket_listen($server);

$selectSockets = [$server];
$null = null;
for ($i = 0; $i < 8; $i++) {
    $pid = pcntl_fork();

    if ($pid > 0) {

    } else {
        while (true) {
            $result = @socket_accept($server);

            if (false === $result) {
                $errCode = socket_last_error($server);
                if (0 !== $errCode) {
                    throw new Exception(socket_strerror($errCode));
                }
            } else {
                $readSockets = [$result];
                $buffer = '';
                $requestFinished = false;
                while (!$requestFinished) {
                    $count = @socket_select($readSockets, $null, $readSockets, 2);

                    if ($count) {
                        $read = socket_read($result, 4096);

                        if ($read === '0' || $read) {
                            $requestFinished = true;
                        } else {
                            $buffer .= $read;
                        }
                    }
                }

                socket_write($result, 'HTTP/1.1 200 OK' . "\r\n\r\n" . 'Hello World');
                socket_close($result);
            }


            @socket_select($selectSockets, $null, $null, 10);
        }
    }
}

pcntl_wait($status);

我用来测试的命令:

ab -c 25 -n 1000 http://127.0.0.1:9090/

0 个答案:

没有答案