Отвечу это myselfe. Я пошел по ней построчно .. вот как это работает (я только объяснить часть в то время (правда) петли.
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'];
}
Это asings недавно созданные подключения к $ прочитать массив наблюдать за входящие данные.
// Set up a blocking call to socket_select()
if (socket_select($read, $write = NULL, $except = NULL, $tv_sec = 5) < 1)
continue;
Часы массив $ прочитанного для новых данных (я все еще немного неясно, как это работает)
/* 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]);
}
Сначала он видит, есть ли еще активное соединение, если оно не закрывается. Если есть соединение, оно считывает данные, если нет этого, это код для отключения. Если есть данные, он передает их другим клиентам (но сам по себе).
Это ти. Надеюсь, я все понял.
Ничего себе. Отображение сайта, на которое вы ссылаетесь, почти невыносимо медленное. – relet
Я попробовал установить код, но у меня были проблемы. просто google "php socket server tutorial", и код в основном одинаковый везде (все они сбрасывают zend) – Putr