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;
Я конечно могу придумать велосипед со всякими проверками :) Но мб можно как-то получше извернуться.