Я отвечу на это myselfe.Я перебирал это построчно ... вот как это работает (я объясняю только часть в циклах while (true).
1.
// Setup clients listen socket for reading
$read[0] = $sock;
for ($i = 0; $i < $max_clients; $i++) {
if (isset($client[$i]['sock']))
$read[$i + 1] = $client[$i]['sock'];
}
Это свежоСоздал подключения к массиву $ read для отслеживания входящих данных.
// Set up a blocking call to socket_select()
if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1)
continue;
Отслеживает массив $ read для новых данных (мне все еще немного неясно, как это работает)
/* if a new connection is being made add it to the client array */
if (in_array($sock, $read)) {
for ($i = 0; $i < $max_clients; $i++) {
if (empty($client[$i]['sock'])) {
$client[$i]['sock'] = socket_accept($sock);
echo "New client connected $i\r\n";
break;
}
elseif ($i == $max_clients - 1)
echo "Too many clients...\r\n";
}
}
Определяет, когда устанавливается новое соединение, затем находит пустое место в массиве $ client и добавляет сокет.
Эту следующую часть я разделю для более простого объяснения.
for ($i = 0; $i < $max_clients; $i++) { // for each client
if (isset($client[$i]['sock'])) {
Перебирает весь массив $ client, но работает только с теми, которые действительно имеют соединение.
if (in_array($client[$i]['sock'], $read)) {
$input = socket_read($client[$i]['sock'], 1024);
if ($input == null) {
echo "Client disconnecting $i\r\n";
// Zero length string meaning disconnected
unset($client[$i]);
} else {
echo "New input received $i\r\n";
// send it to the other clients
for ($j = 0; $j < $max_clients; $j++) {
if (isset($client[$j]['sock']) && $j != $i) {
echo "Writing '$input' to client $j\r\n";
socket_write($client[$j]['sock'], $input, strlen($input));
}
}
if ($input == 'exit') {
// requested disconnect
socket_close($client[$i]['sock']);
}
}
} else {
echo "Client disconnected $i\r\n";
// Close the socket
socket_close($client[$i]['sock']);
unset($client[$i]);
}
Сначала он видит, есть ли еще активное соединение, если нет, то закрывает его.это соединение, которое считывает данные, если нет никого, это код для разъединения. Если есть данные, они передают их другим клиентам (но это полезно).
Вот так. Надеюсь, я понял это правильно.