我正在使用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/