Объясните базовый код сервера PHP Socket

Я пытаюсь узнать, как сделать чат с сервером сокетов.

Я заметил, что каждый использует тот же код (ripoff из зоны zend-разработчика).
Проблема в том, что никто не объясняет, как это работает. Особенно критический код после while (true) { .

Это принесет пользу многим, поэтому я надеюсь, что кто-то сможет потратить время и подробно объяснить код ( ПОДРОБНО! ).

Вы можете найти здесь код

Я отвечу сам. Я прошел по ней по строкам. Вот как это работает (я объясняю только часть циклов 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]); } с 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]); } с 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]); } 

Сначала он видит, есть ли еще активное соединение, если оно не закрывается. Если есть соединение, оно считывает данные, если нет этого, это код для отключения. Если есть данные, он передает их другим клиентам (но сам по себе).

Это ти. Надеюсь, я все понял.

PHP не многопоточен, из-за этого вы не можете создать хороший сервер сокетов. Вместо этого используйте Python.