¿Qué es Swoole?

Escrito por Juan Felipe Morales Zavala

7 de noviembre de 2019

Es un framework de red de alto rendimiento, que utiliza un modelo de Entrada/Salida asíncrono sin bloqueo controlado por eventos, lo cual lo hace escalable y eficiente. Escrito en lenguaje C sin bibliotecas de terceros como extensión de PHP.

Permite a los desarrolladores de PHP escribir servicios TCP, UDP, Unix Socket, HTTP, WebSocket de alto rendimiento, escalables y concurrentes en lenguaje de programación PHP, sin demasiado conocimiento sobre la programación de Entrada/Salida sin bloqueo y el kernel de Linux de bajo nivel.

En comparación con otros marcos de programación asincrónicos o software como Nginx, Tornado, Node.js, Swoole tiene módulos asíncronos de Entrada/Salida de múltiples hilos integrados. Los desarrolladores pueden usar la API de sincronización o asíncrona para escribir las aplicaciones.

Como instalar (en linux mint)

Segun la documentación solo debes de hacer un simple

#!/bin/bash
pecl install swoole

Aunque a mi en Linux mint me dio un par de problemillas (debo decir que era una instalacion casi limpia), así que debes de asegurarte de haber instalado los prerequisitos primero

Sistema operativo: Linux, FreeBSD or MacOS
Versión del kernel de Linux >= 2.3.32
Versión de PHP >= 5.3.10
Versión de GCC >= 4.4
Versión de Cmake >= 2.4 (Cmake es requerido para compilar libswoole)
Versión de recomendada de  Linux: Ubuntu 14, CentOS 7 or mayor (esto es para servidores, recuerda que siempre es mejor la LTS).

Asi que al principio cuando quise instalar me tiraba el siguiente error

Lo que me faltaba era instalar g++:

sudo apt-get install g++

Por cierto tambien tuve que instalar lo siguiente

sudo apt-get install php7.2-dev
sudo apt install php-pear

Une vez instalado pear

sudo pecl channel-update pecl.php.net

Y así es como finalmente pude correr el comando

pecl install swoole
johntzulik@DarkStorm:~/swoole-src$ sudo pecl install swoole
downloading swoole-4.4.12.tgz ...
Starting to download swoole-4.4.12.tgz (1,436,554 bytes)
......................................................................................done: 1,436,554 bytes
391 source files, building
running: phpize
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
enable sockets supports? [no] :
enable openssl support? [no] :
enable http2 support? [no] :
enable mysqlnd support? [no] :
building in /tmp/pear/temp/pear-build-roothoSYxh/swoole-4.4.12

Te va a preguntar si deseas habilitar soporte para sockets, openssl, http2, mysqlnd si le das enter el no estará por default.

Pasará un rato en lo que compila y finalmente te mostrará este mensaje o algo parecido:

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------
Build complete.
Don't forget to run 'make test'.
running: make INSTALL_ROOT="/install-swoole-4.4.12" install
Installing shared extensions: /install-swoole-4.4.12/usr/lib/php/20170718/
Installing header files: /install-swoole-4.4.12/usr/include/php/20170718/
running: find "/install-swoole-4.4.12" | xargs ls -dils
/install-swoole-4.4.12
/install-swoole-4.4.12/usr
/install-swoole-4.4.12/usr/include
/install-swoole-4.4.12/usr/include/php
/install-swoole-4.4.12/usr/include/php/20170718
/install-swoole-4.4.12/usr/include/php/20170718/ext
/install-swoole-4.4.12/usr/include/php/20170718/ext/swoole
/install-swoole-4.4.12/usr/include/php/20170718/ext/swoole/config.h
/install-swoole-4.4.12/usr/include/php/20170718/ext/swoole/include
/install-swoole-4.4.12/usr/include/php/20170718/ext/swoole/thirdparty
/install-swoole-4.4.12/usr/include/php/20170718/ext/swoole/thirdparty/hiredis
/install-swoole-4.4.12/usr/lib
/install-swoole-4.4.12/usr/lib/php
/install-swoole-4.4.12/usr/lib/php/20170718
/install-swoole-4.4.12/usr/lib/php/20170718/swoole.so
Build process completed successfully
Installing '/usr/lib/php/20170718/swoole.so'
Installing '/usr/include/php/20170718/ext/swoole/config.h'
install ok: channel://pecl.php.net/swoole-4.4.12
configuration option "php_ini" is not set to php.ini location
You should add "extension=swoole.so" to php.ini

Una vez terminado te menciona que debes de agregar la extension de swoole.so

# verificar la ubicación del archivo php.ini
php -i | grep php.ini
# agregar la extencion al archivo
sudo echo "extension=swoole.so" >> php.ini
# verificar que la extensión se haya agregado
php -m | grep swoole

Ahora para probar que todo esta corriendo perfectamente vamos a poner el siguiente código en el sitio de tu preferencia:

<?php
$http = new swoole_http_server("127.0.0.1", 9501);

$http->on('start', function ($server) {
echo "Swoole http server is started at http://127.0.0.1:9501\n";
});

$http->on('request', function ($request, $response) {
$response->header("Content-Type", "text/plain");
$response->end("Hello World\n");
});

$http->start();

Una vez hecho esto puedes ir a tu consola e ingresar lo siguiente:

php server.php

y te mandará el siguiente mensaje:

Swoole http server is started at http://127.0.0.1:9501

Podras ir al sitio que muestra y te mandará un mensaje de Hello World como en la siguiente imagen

Si quieres seguir indagando te dejo el link de su pagina, en donde podras encontrar mas ejemplos y tambien esta la documentación, si quieres probar con docker.

Para poder hacer este articulo estuve viendo algunas paginas, quiza te puedan interesar, habla sobre el rendimiento que maneja swoole vs nginx vs node y la verdad las pruebas muestran algo sorprendente

Swoole: Is it Node in PHP or am I wrong? | TSH.io

Espero en futuras publicaciones seguir con el desarrollo y aplicarlo a algun proyecto, para ser sinceros es que swoole me ha dado en el cora ❤.


¿Qué es Swoole? was originally published in 200 Response on Medium, where people are continuing the conversation by highlighting and responding to this story.