PHP для каждого параллельного подключения к сокетам?

#php #sockets #foreach #parallel-processing

#php #сокеты #для каждого #параллельная обработка

Вопрос:

У меня есть скрипт, который подключается к списку серверов в цикле foreach, используя ассоциативный массив с ip-адресом в качестве ключа и номером порта в качестве значения. Я записываю небольшое количество данных в сокет, затем считываю ответ с сервера. Обычно в массиве 5-15 серверов, и каждая транзакция может занимать несколько сотен миллисекунд, что быстро увеличивает время ожидания пользователя. Есть ли способ, которым я могу выполнять подключения параллельно, чтобы пользователям не приходилось ждать так долго?

 foreach ($clients as $network_address => $port)
{
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        continue;
    }

    $result = socket_connect($socket, $network_address, $port);
    if ($result === false) {
        continue;
    }

    socket_write($socket, $data, strlen($data));

    $response[$network_address] = socket_read($socket, 2048);

    socket_close($socket);
}
  

Комментарии:

1. php.net/manual/en/function.socket-set-nonblock.php может помочь

Ответ №1:

Использование socket_select(array amp;$ read , array amp;$write , array amp;$except , int *$tv_sec* [, int * $ tv_usec * = 0 ]) — лучший способ связаться более чем с одним хостом.