Мне нужно открыть много сокетных соединений, отправить запросы и затем асинхронно ждать ответа. Проблема в том, что когда я отправляю запрос с помощью 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, поэтому я даже не уверен, что правильно понимаю, как это работает. Даже через несколько дней мне не удалось добиться заслуженного результата.
Задача ещё не решена.
Других решений пока нет …