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