Usando Swoole para crear aplicaciones PHP de alto rendimiento
¿Qué es Swoole?
Swoole es un marco de comunicación de red de alto rendimiento para PHP, que ofrece funciones como asincronía, multihilo y corutinas, permitiendo a PHP manejar tareas de alta concurrencia de manera similar a Node.js. Soporta múltiples protocolos como TCP, UDP, UnixSocket, HTTP, WebSocket, entre otros, adecuado para construir servidores web de alto rendimiento, arquitecturas de microservicios, sistemas de comunicación en tiempo real, etc.
Principales características y ventajas de Swoole
- Alto rendimiento: Swoole está escrito en lenguaje C, tiene un rendimiento muy alto, soporta IO asíncrono y corutinas, y puede manejar solicitudes de alta concurrencia.
- Amplia funcionalidad: Soporta múltiples protocolos de red, temporizadores, gestión de procesos, gestión de memoria y otras funcionalidades para satisfacer diversas necesidades de desarrollo.
- Fácil de usar: Proporciona una API simple y fácil de usar y documentación rica, ayudando a los desarrolladores a comenzar rápidamente.
- Alta extensibilidad: Soporta extensiones y plugins personalizados, permitiendo una personalización flexible según las necesidades.
Swoole es una opción ideal para construir aplicaciones web de alto rendimiento y sistemas de comunicación en tiempo real, adecuado para proyectos desde aplicaciones pequeñas hasta grandes sistemas a nivel empresarial.
Instalación de Swoole
En este artículo, presentaremos cómo instalar y usar Swoole en el entorno de ServBay.
TIP
ServBay recomienda a los desarrolladores colocar el sitio web en el directorio/Applications/ServBay/www
para facilitar la gestión.
Paso 1: Instalar la extensión Swoole
Habilitar la extensión Swoole
ServBay ya tiene integrado Swoole, los usuarios deben activarlo y reiniciar PHP. Consulte el artículo Cómo habilitar el módulo Swoole integrado de ServBay para activar el módulo Swoole.
Paso 2: Crear el directorio del proyecto
Cree el directorio del proyecto y entre en él:
cd /Applications/ServBay/www
mkdir servbay-swoole-app
cd servbay-swoole-app
2
3
Paso 3: Crear el script del servidor Swoole
En el directorio del proyecto, cree un archivo server.php
y escriba un servidor HTTP Swoole simple:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server("0.0.0.0", 9501);
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
});
$server->on("request", function (Request $request, Response $response) {
$response->header("Content-Type", "text/plain");
$response->end("Hello ServBay!");
});
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Paso 4: Ejecutar el servidor Swoole
En la terminal, ejecute el siguiente comando para iniciar el servidor Swoole:
php server.php
Verá la siguiente salida:
Swoole HTTP server is started at http://0.0.0.0:9501
Paso 5: Acceder al servidor Swoole
Abra su navegador y visite http://localhost:9501
, verá la salida Hello ServBay!
.
Usar Swoole para construir una aplicación web
En esta sección, presentaremos cómo usar Swoole para crear una aplicación web simple.
Crear controladores y rutas
En el directorio del proyecto, cree un directorio app
y dentro de él, cree los directorios controllers
y routes
:
mkdir -p app/controllers
mkdir -p app/routes
2
En el directorio app/controllers
, cree un archivo HomeController.php
:
<?php
namespace App\Controllers;
class HomeController
{
public function index()
{
return "Welcome to ServBay!";
}
public function hello($name)
{
return "Hello, $name!";
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
En el directorio app/routes
, cree un archivo web.php
:
<?php
use App\Controllers\HomeController;
return [
'GET /' => [HomeController::class, 'index'],
'GET /hello/{name}' => [HomeController::class, 'hello'],
];
2
3
4
5
6
7
8
Actualizar el script del servidor Swoole
Actualice el archivo server.php
para añadir la lógica de enrutamiento y llamada a controladores:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
use FastRoute\RouteCollector;
use function FastRoute\simpleDispatcher;
require 'vendor/autoload.php';
$server = new Server("0.0.0.0", 9501);
$routes = require __DIR__ . '/app/routes/web.php';
$dispatcher = simpleDispatcher(function (RouteCollector $r) use ($routes) {
foreach ($routes as $route => $handler) {
list($method, $path) = explode(' ', $route);
$r->addRoute($method, $path, $handler);
}
});
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
});
$server->on("request", function (Request $request, Response $response) use ($dispatcher) {
$routeInfo = $dispatcher->dispatch($request->server['request_method'], $request->server['request_uri']);
switch ($routeInfo[0]) {
case \FastRoute\Dispatcher::NOT_FOUND:
$response->status(404);
$response->end('404 Not Found');
break;
case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$response->status(405);
$response->end('405 Method Not Allowed');
break;
case \FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
list($class, $method) = $handler;
$response->header("Content-Type", "text/plain");
$response->end(call_user_func_array([new $class, $method], $vars));
break;
}
});
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Instalar FastRoute
Ejecute el siguiente comando en el directorio raíz del proyecto para instalar la biblioteca de enrutamiento FastRoute:
composer require nikic/fast-route
Ejecutar el servidor Swoole
En la terminal, ejecute el siguiente comando para iniciar el servidor Swoole:
php server.php
Acceder a la aplicación web
Abra su navegador y visite las siguientes URL:
http://localhost:9501/
: verá la salidaWelcome to ServBay!
.http://localhost:9501/hello/ServBay
: verá la salidaHello, ServBay!
.
Usar Swoole para manejar conexiones WebSocket
Swoole también soporta el protocolo WebSocket, que se puede usar para construir aplicaciones de comunicación en tiempo real. Presentaremos cómo usar Swoole para manejar conexiones WebSocket.
Crear el script del servidor WebSocket
En el directorio del proyecto, cree un archivo websocket_server.php
y escriba un servidor WebSocket simple:
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
$server = new Server("0.0.0.0", 9502);
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
});
$server->on("message", function (Server $server, Frame $frame) {
echo "received message: {$frame->data}\n";
$server->push($frame->fd, "Hello, {$frame->data}");
});
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Ejecutar el servidor WebSocket
En la terminal, ejecute el siguiente comando para iniciar el servidor WebSocket:
php websocket_server.php
Verá la siguiente salida:
Swoole WebSocket server is started at ws://0.0.0.0:9502
Conectar al servidor WebSocket
Puede usar un cliente WebSocket en el navegador u otras herramientas de cliente WebSocket (como wscat
) para conectarse al servidor WebSocket.
Usar wscat
para conectar
Instalar
wscat
:bashnpm install -g wscat
1Conectarse al servidor WebSocket:
bashwscat -c ws://localhost:9502
1Enviar un mensaje:
bash> Hello ServBay
1
Verá el mensaje de respuesta del servidor:
< Hello, Hello ServBay
A través de los pasos anteriores, ha creado y ejecutado exitosamente un proyecto Swoole, y ha utilizado las funcionalidades que Swoole ofrece para manejar solicitudes HTTP y conexiones WebSocket. El alto rendimiento y la rica funcionalidad de Swoole lo hacen una opción ideal para construir aplicaciones de alta concurrencia.