Инструменты пользователя

Инструменты сайта


php:swoole:bystryj_start

Быстрый старт

Swoole Большинство функций можно использовать только в среде командной строки cli, сначала подготовьте среду Linux Shell. Вы можете использовать Vim, Emacs, PhpStorm или другие редакторы для написания кода и выполнения программы в командной строке со следующими инструкциями.

php /path/to/your_file.php

После, если в вашем коде нет инструкции echo, вывод на экран не будет, но на самом деле нижний слой уже прослушивает сетевой порт, ожидая клиента чтобы инициировать соединение. Используйте соответствующие клиентские инструменты и программы для подключения к серверу для тестирования.

Управление процессом

По умолчанию, после запуска службу Swoole, можно завершить через CTRL+C , но будут проблемы, если окно закроется в это время, и его нужно запускаться в фоновом режиме. Для получения дополнительной информации см. Демонизация

Большинство примеров в кратком руководстве представляют собой шаблоны программирования в асинхронном стиле, и функции в примерах также могут быть реализованы в стиле сопрограммы, см. серверную часть (стиль сопрограммы).

Swoole Большинство предоставленных модулей можно использовать только в терминале командной строки cli. В настоящее время в среде PHP-FPM можно использовать только синхронные блокирующие клиенты.

TCP server

code

server.php

//Создаем объект Server и прослушиваем порт 127.0.0.1:9501
$server = new Swoole\Server('127.0.0.1', 9501);
 
//прослушивание события в процессе соединения
$server->on('Connect', function ($server, $fd) {
    echo "Client: Connect.\n";
});
 
//прослушивание события получения данных
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "Server: {$data}");
});
 
//прослушивание события закрытия соединения
$server->on('Close', function ($server, $fd) {
    echo "Client: Close.\n";
});
 
//запускаем сервер
$server->start();

Это создает TCP-сервер, прослушивающий локальный порт 9501. Его логика проста: когда клиент Socket отправляет по сети строку hello, сервер отвечает строкой Server: hello.

Server - это асинхронный сервер, поэтому программа пишется путем прослушивания событий. При возникновении соответствующего события нижний уровень будет вызывать указанную функцию. Например, обратный вызов события onConnect будет выполняться при поступлении нового TCP-соединения, а функция onReceive будет вызываться обратно, когда соединение отправляет данные на сервер.

  • К серверу могут одновременно подключаться тысячи клиентов, $fd, который является уникальным идентификатором клиентского соединения.
  • Вызвать метод $server-send() для отправки данных клиентскому соединению, параметром является идентификатор клиента $fd
  • Вызовите метод $server-close(), чтобы принудительно закрыть клиентское соединение.
  • Клиент может отключиться, и в это время будет запущен обратный вызов события onClose.

выполнить программу

php server.php

Запустите программу server.php. После успешного запуска вы можете использовать инструмент netstat, чтобы посмотреть, что порт 9501 прослушивается.

Затем вы можете использовать инструмент telnet/netcat для подключения к серверу.

telnet 127.0.0.1 9501
hello
Server: hello

Простые средства обнаружения невозможности подключения к серверу

  • В Linux используйте netstat -an | grep port, чтобы увидеть, был ли порт открыт в состоянии Listening
  • После подтверждения на предыдущем шаге снова проверьте проблему с брандмауэром.
  • Обратите внимание на IP-адрес, используемый сервером. Клиент может использовать только 127.0.0.1 для подключения.
  • Если вы используете сервис Alibaba Cloud или сервис Tencent, вам необходимо установить порт разработки в группе разрешений безопасности.

UDP server

code

udp_server.php

$server = new Swoole\Server('127.0.0.1', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
 
//прослушивание события получения данных
$server->on('Packet', function ($server, $data, $clientInfo) {
    var_dump($clientInfo);
    $server->sendto($clientInfo['address'], $clientInfo['port'], "Server:{$data}");
});
 
//запускаем сервер
$server->start();Copy to clipboardErrorCopied

В отличие от серверов TCP, серверы UDP не имеют концепции соединений. После запуска Сервера клиент может напрямую отправлять пакеты данных на порт 9502, контролируемый Сервером, без Подключения. Соответствующее событие onPacket.

  • $clientInfo - это важная информация о клиенте, которая представляет собой массив, включая IP-адрес клиента, порт и т. д.
  • Вызов метода $server→sendto для отправки данных клиенту

start the service

php udp_server.php

UDP-сервер можно использовать для проверки соединения netcat -u.

netcat -u 127.0.0.1 9502
hello
Server: hello

HTTP server

code

http_server.php

$http = new Swoole\Http\Server('0.0.0.0', 9501);
 
$http->on('Request', function ($request, $response) {
    $response->header('Content-Type', 'text/html; charset=utf-8');
    $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});
 
$http->start();Copy to clipboardErrorCopied

HTTP Серверу нужно обработать запрос, поэтому ему нужно только прослушивать событие onRequest. Это событие запускается при появлении нового запроса.

Приходит HTTP-запрос. Функция обратного вызова события имеет два параметра, один из которых является объектом $request, который содержит соответствующую информацию о запросе, например, запрошенные данные GET/POST.

Другой — это объект ответа, и запросить ответ можно, манипулируя объектом $response. $response-end() Метод означает вывод фрагмента HTML контента и завершение запроса.

  • 0.0.0.0 Указывает на мониторинг всех IP-адресов, сервер может иметь несколько одновременно IP-адресов, например, 127.0.0.1, локальный IP-адрес, 192.168.1.100 LAN IP, 210.127.20.2 внешний сетевой IP, здесь вы также можете указать один IP для мониторинга
  • 9501 Прослушиваемый порт, если программа занята, она выдаст фатальную ошибку и прервет выполнение.

запустить службу

php http_server.php
  • Вы можете открыть браузер и посетить http://127.0.0.1:9501 для просмотра результатов программы.
  • ab Серверы также можно подвергать стресс-тестированию с помощью инструментов Apache.

Проблема с двойным запросом Chrome

При использовании браузера Chrome для доступа к серверу будет сгенерирован дополнительный запрос, /favicon.ico, на который можно ответить кодом с ошибкой 404 .

$http->on('Request', function ($request, $response) {
    if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') {
        $response->end();
        return;
    }
    var_dump($request->get, $request->post);
    $response->header('Content-Type', 'text/html; charset=utf-8');
    $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});Copy to clipboardErrorCopied

URL routing

Applications can $request→server['request_uri']implement . Such as: http://127.0.0.1:9501/test/index/?a=1, URLrouting .

$http->on('Request', function ($request, $response) {
    list($controller, $action) = explode('/', trim($request->server['request_uri'], '/'));
    //?? $controller, $action ?????????????
    (new $controller)->$action($request, $response);
});Copy to clipboardErrorCopied
php/swoole/bystryj_start.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)