socket_select. PHP

Я хотел написать сервер (который слушает какой-то порт, в моем случае 127.0.0.1:80), но почему-то он не работает. Я понял, что пока есть, что читать (socket_read) он работает, но как только клиент перестает оправлять данные, socket_select не видит изменений, из-за этого я не могу попасть в блок if в foreach. Вот код

<?php


$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, '127.0.0.1', 80);
socket_listen($sock, 10);

$clients = [];
$client_buf = [];
$write = $except = null;

$key_main_socket = 'main_socket';
$key_client_socket = 'client_socket';
$client_id = 1;


while(true):
    $read = [$key_main_socket => $sock, ...$clients];

    socket_select($read, $write, $except, 1, 0);

    if (array_key_exists($key_main_socket, $read))
    {
        $clients["$key_client_socket$client_id"] = socket_accept($sock);
        $client_id++;
        unset($read[$key_main_socket]);
    }

    foreach($read as $key => $client)
    {
        $buf = socket_read($client, 1024);

        if($buf === '')
        {
            echo($client_buf[$key].PHP_EOL);
            socket_close($client);
            unset($clients[$key], $client_buf[$key]);
            continue;
        }
        @$client_buf[$key] .= $buf;
    }

endwhile;

Я конечно могу придумать велосипед со всякими проверками :) Но мб можно как-то получше извернуться.


Ответы (0 шт):