PHP Опрос сокетов пожирает процессор - PullRequest
0 голосов
/ 30 апреля 2020

Я написал пару PHP серверов сокетов, которые слушают команды и отвечают на них. Проблема в том, что они делают это, слушая бесконечно l oop, и, таким образом, поглощают ЦП.

Итак, как мне это сделать (1), не израсходовав ЦП; и (2) без замедления команд сокета, особенно если у меня есть несколько последовательных команд?

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sock, $address, $port);
socket_listen($sock);

$clients = array($sock);
$write = NULL;
$except = NULL;

while (true) {
    $read = $clients;

    if (socket_select($read, $write, $except, 0) < 1)
        continue;

    if (in_array($sock, $read)) {
        $clients[] = socket_accept($sock);
        $key = array_search($sock, $read);
        unset($read[$key]);
    }

    foreach ($read as $read_sock) {

    /* I tried putting a tiny sleep here, but if I run several socket connections for the same user sequentially, they see a notable slowdown */

        $data = @socket_read($read_sock, 1024, PHP_NORMAL_READ);

        if ($data === false) {
            $key = array_search($read_sock, $clients);
            unset($clients[$key]);
            echo "client disconnected.\n";
            continue;
        }

        $data = trim($data);

        /* And this is the heart of my loop */

     }

    } // end of reading foreach
}

// close the listening socket
socket_close($sock);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...