Объясните базовый код PHP Socket сервера - PullRequest
2 голосов
/ 26 июля 2010

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

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

Это пошло бы на пользу многим, поэтому я надеюсь, что кто-то найдет время и подробно объяснит код ( ДЕТАЛИ! ).

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

Ответы [ 2 ]

2 голосов
/ 26 июля 2010

Я отвечу на это 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]);
        }

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

Вот так. Надеюсь, я понял это правильно.

0 голосов
/ 26 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...