PHP работает с сокетами асинхронно

Мне нужно открыть много сокетных соединений, отправить запросы и затем асинхронно ждать ответа. Проблема в том, что когда я отправляю запрос с помощью fwrite, он блокирует все, пока не появится ответ. Я пытался переключить поток на неблокирующую, но затем вызов fwrite () выбрасывает «errno = 11 Resource временно недоступен»

$calls = [];
foreach ($items as $item) {

$calls[$item['key']] = stream_socket_client($item['ip'].':43',$errno, $errstr, 10, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT)
//stream_set_blocking($calls[$item['key']], false);  doesn't work
fwrite($calls[$item['key']], $item['request'] . "\r\n");

}

Если я закомментирую fwrite (), все займет всего несколько мс, но с fwrite () этот foreach () займет около 20 секунд (конечно, зависит от количества элементов).

Мне нужно отправить эти запросы, а затем ждать, пока все вернется, и записать это в массив. Для этой обработки запросов я использую цикл while:

while (!empty($calls)){
foreach ($calls as $key => $call) {
if (!feof($call)) {

if (!isset($results[$key])){
$results[$key] = fgets($call, 2048);
} else {
$results[$key] .= fgets($call, 2048);
}

} else {

fclose($calls[$key]);
unset($calls[$key]);

}
}
}

Вероятно, есть и лучший способ повысить эффективность работы с ответами, поэтому я буду рад любым подсказкам, но главная проблема сейчас заключается в fwrite ().

Я довольно новичок в работе с асинхронными сокетами в PHP, поэтому я даже не уверен, что правильно понимаю, как это работает. Даже через несколько дней мне не удалось добиться заслуженного результата.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …