Вопрос в том, что должно быть вместо /* ????????? */ чтобы код выполнился правильно?
В интернете нашел ответ unset($write_map[$index]); и пояснение, что эта задача на исправление логики скрипта. Т.е. остальное просто чтобы запутать?
Но мне не понятно другое все таки - $data['buf']. Это опечатка вместо, $data['data'], или где берется этот элемент массива? И вообще насколько данный скрипт пригоден для использования?
function get_socket($host, $port) {
// открывется соединение с интернет сокетом
$fr = fsockopen($host, $port);
// поток переключен в неблокирующий режим
stream_set_blocking($fr, false);
return $fr;
}
// формируется массив (сокет и данные) для 3-х потоков
$write_map[] = array('fr' => get_socket($host1, $port1), 'data' => str_pad("", 500000, "A"));
$write_map[] = array('fr' => get_socket($host2, $port2), 'data' => str_pad("", 500000, "B"));
$write_map[] = array('fr' => get_socket($host3, $port3), 'data' => str_pad("", 500000, "C"));
do {
// формируется массив сокетов
$write_sockets = array();
foreach ($write_map as $data) {
$write_sockets[] = $data['fr'];
}
//Потоки, перечисленные в массиве $write_sockets, будут отслеживаться на предмет того,
//что запись в них не будет блокироваться.
$num_returned = stream_select($r = null, $write_sockets, $e = null, 30);
//если что-то изменилось в массиве $write_sockets возвращается кол-во измененных потоков
if ($num_returned) {
foreach ($write_sockets as $fr) {
foreach ($write_map as $index => $data) {
if ($data['fr'] === $fr) {
$len = fwrite($fr, $data['buf']);// откуда возьмется $data['buf'] ?
//для чего последующие действия?
if ($len) {
$data['buf'] = substr($data['buf'], $len);
if (empty($data['buf'])) {
fclose($data['fr']);
/* ????????? */
}
}
}
}
}
}
} while (count($write_map));