====== Быстрый старт ====== **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('

Hello Swoole. #' . rand(1000, 9999) . '

'); }); $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('

Hello Swoole. #' . rand(1000, 9999) . '

'); });Copy to clipboardErrorCopied
===== URL routing ===== Applications can ''$request->server%%['%%request_uri']''implement . Such as: ''http://127.0.0.1:9501/test/index/?a=1'', ''URL''routing . $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