Crear y ejecutar un proyecto Webman en ServBay
¿Qué es Webman?
Webman es un framework web asíncrono de alto rendimiento basado en Workerman, especialmente diseñado para construir aplicaciones web de alta concurrencia y alto rendimiento. A diferencia de los frameworks tradicionales de PHP basados en bloqueo síncrono, Webman adopta un modelo de I/O asíncrono y dirigido por eventos, permitiéndole destacar en la gestión de grandes volúmenes de peticiones simultáneas. Webman proporciona una API sencilla y flexible, facilitando la creación de aplicaciones en tiempo real, servicios API, microservicios y más.
Principales características y ventajas de Webman
- Alto rendimiento: Basado en Workerman, utiliza I/O asíncrono y dirigido por eventos, capaz de manejar innumerables conexiones concurrentes. Su rendimiento supera con creces el de los frameworks síncronos tradicionales.
- Fácil de usar: Ofrece una API clara e intuitiva y un conjunto de características completas que permiten a los desarrolladores comenzar rápidamente y construir aplicaciones ágilmente.
- Soporte multiprotocolo: Soporta de forma nativa HTTP, WebSocket y otros protocolos de capa de aplicación comunes, facilitando la creación de distintos tipos de servicios.
- Expansión flexible: Se puede extender fácilmente mediante paquetes de Composer, plugins y middleware.
- Bajo consumo de recursos: Comparado con el modelo tradicional de servidor web + PHP-FPM, Webman actúa como una aplicación residente en memoria, reduciendo el consumo de recursos.
- Gran soporte comunitario: Una comunidad activa de desarrolladores y abundante documentación.
Webman ayuda a los desarrolladores a crear rápidas aplicaciones y servicios web de alto rendimiento y alta disponibilidad, especialmente adecuados para escenarios de alta concurrencia y baja latencia.
Crear y ejecutar un proyecto simple de Webman con ServBay
Esta guía explica en detalle cómo crear y ejecutar un proyecto web simple con Webman en el entorno de desarrollo local de ServBay. Mostraremos cómo instalar Webman, escribir rutas y controladores básicos, e integrar los servicios de bases de datos (MySQL, PostgreSQL) y caché (Redis, Memcached) que ofrece ServBay.
TIP
ServBay recomienda a los desarrolladores ubicar todos los proyectos web locales en el directorio /Applications/ServBay/www para una gestión centralizada, como la configuración de sitios locales (anteriormente llamados “hosts”).
Requisitos previos
Antes de comenzar, asegúrate de tener lo siguiente preparado:
- Instalar ServBay: Ya tienes ServBay instalado correctamente en macOS. ServBay ofrece un entorno completo de desarrollo local que incluye PHP, Composer, MySQL, PostgreSQL, Redis, Memcached y todos los paquetes necesarios para este tutorial.
- Habilitar los paquetes necesarios: Desde el panel de control de ServBay, asegúrate de que los siguientes paquetes estén instalados y en funcionamiento:
- La versión de PHP que elijas (se recomienda una versión reciente, como PHP 8.x)
- Composer (ya incluido en ServBay)
- MySQL
- PostgreSQL
- Redis
- Memcached
- Asegúrate de que la versión de PHP seleccionada tenga habilitadas las extensiones necesarias como
memcached,redis,pdo_mysql,pdo_pgsql, etc. ServBay suele activarlas por defecto, pero puedes verificar en la configuración de PHP de ServBay.
- Acceso a la terminal: Estar familiarizado con el uso de la app Terminal de macOS.
Instalar Webman
Verifica que Composer esté disponible
ServBay viene con Composer preinstalado y configurado para usarse directamente desde la terminal. Puedes comprobarlo ejecutando:
bashcomposer --version1Si ves la información de la versión correctamente, Composer está listo para usarse.
Accede al directorio de sitios web de ServBay
Abre la terminal y navega al directorio raíz recomendado para sitios web en ServBay:
bashcd /Applications/ServBay/www1Crea un proyecto Webman con Composer
Usa el comando
create-projectde Composer para instalar el framework Webman en el directorio que elijas. En este ejemplo, lo llamamosservbay-webman-app:bashcomposer create-project workerman/webman servbay-webman-app1Composer descargará Webman y sus dependencias principales dentro del directorio
servbay-webman-app.Accede al directorio del proyecto
Una vez finalizada la instalación, entra en el nuevo directorio del proyecto:
bashcd servbay-webman-app1Instala los componentes necesarios
Para mostrar el uso de base de datos y caché, instalaremos algunos paquetes adicionales de Composer. Webman suele utilizar
illuminate/database(el componente de base de datos de Laravel),illuminate/redisy otros. El parámetro-W(--with-dependencies) asegura que se resuelvan las dependencias y la compatibilidad.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper1Este comando instala el ORM para bases de datos, el cliente de Redis, componentes de paginación, despacho de eventos y la herramienta de depuración VarDumper.
Crear la base de datos y la tabla
Para que los ejemplos funcionen, necesitamos crear la base de datos correspondiente y la tabla users tanto en MySQL como en PostgreSQL de ServBay. La contraseña predeterminada del usuario root es password.
Puedes usar las herramientas de gestión incluidas en ServBay (como phpMyAdmin o pgAdmin, accesibles desde el panel de control de ServBay) o la línea de comandos para ejecutar los siguientes SQL.
Crear la base de datos
webman_app- MySQL:sql
CREATE DATABASE IF NOT EXISTS webman_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;1 - PostgreSQL:sql
CREATE DATABASE webman_app;1
- MySQL:
Crear la tabla
usersdentro de la base de datoswebman_app- MySQL:sql
USE webman_app; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );1
2
3
4
5
6
7 - PostgreSQL:sql
\c webman_app; -- Conéctate a la nueva base de datos CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );1
2
3
4
5
6
7
- MySQL:
Escribir el código del proyecto web
A continuación, añadiremos el código necesario para definir las rutas, crear los controladores y la lógica para interactuar con la base de datos y los sistemas de caché.
Configura las rutas
Edita el archivo
config/route.phpen la raíz del proyecto, agregando el siguiente código para definir las rutas necesarias:php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // Define la ruta raíz, mapeando al método index de IndexController Route::any('/', [IndexController::class, 'index']); // Define rutas relacionadas con la caché Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // Define rutas para la base de datos Route::any('/mysql-add', [DatabaseController::class, 'mysqlAdd']); Route::any('/mysql', [DatabaseController::class, 'mysqlGet']); Route::any('/pgsql-add', [DatabaseController::class, 'pgsqlAdd']); Route::any('/pgsql', [DatabaseController::class, 'pgsqlGet']); // Puedes agregar más rutas aquí...1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Crea los archivos de controladores
Dentro del directorio
app/controller, crea los archivosIndexController.php,CacheController.phpyDatabaseController.phpy añade el siguiente código para cada uno.app/controller/IndexController.php: Maneja peticiones a la ruta raíz.php<?php namespace app\controller; use support\Request; use support\Response; // Importar la clase Response class IndexController { /** * Método de ejemplo para manejar la ruta raíz * @param Request $request Objeto de la petición actual * @return Response Devuelve una respuesta */ public function index(Request $request): Response // Especificar el tipo de retorno { // Devuelve una respuesta de texto sencilla return response('¡Hola ServBay & Webman!'); // Mensaje de bienvenida actualizado } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20app/controller/CacheController.php: Demuestra el uso de Memcached y Redis.php<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // Importar la clase Memcached use support\Redis; // Importar el facade Redis de Webman class CacheController { /** * Ejemplo de uso de Memcached * @param Request $request * @return Response */ public function memcached(Request $request): Response { // Conectar al servidor Memcached, por defecto en 127.0.0.1:11211 en ServBay $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); // Establece un ítem de caché válido por 60 segundos $success = $memcached->set('servbay_key', '¡Hola Memcached desde ServBay!', 60); // Clave y valor actualizados if (!$success) { return response('No se pudo guardar la clave en Memcached', 500); } // Obtener el valor cacheado $value = $memcached->get('servbay_key'); // Clave actualizada // Devuelve el valor encontrado o un mensaje si expiró/no existe return response($value ?: 'Clave de Memcached no encontrada o expirada'); // Mensaje actualizado } /** * Ejemplo de uso de Redis * @param Request $request * @return Response */ public function redis(Request $request): Response { // Usa el facade Redis de Webman para guardar un valor en caché Redis::set('servbay_redis_key', '¡Hola Redis desde ServBay!'); // Clave y valor actualizados // Recupera el valor cacheado de Redis $value = Redis::get('servbay_redis_key'); // Clave actualizada // Devuelve el valor encontrado o un mensaje si no existe return response($value ?: 'Clave de Redis no encontrada'); // Mensaje actualizado } }1
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
49
50
51
52app/controller/DatabaseController.php: Demuestra operaciones de base de datos con MySQL y PostgreSQL.php<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // Importar el facade Db de Webman class DatabaseController { /** * Agrega un usuario a la base de datos MySQL * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Conecta a MySQL e inserta el usuario Db::connection('mysql')->table('users')->insert([ 'name' => 'Usuario MySQL de ServBay Webman', // Datos de ejemplo actualizados 'email' => 'mysql_demo@servbay.test', // Correo de ejemplo actualizado 'created_at' => date('Y-m-d H:i:s') // Se añade created_at ]); return response('Usuario agregado a MySQL'); // Mensaje actualizado } catch (\Exception $e) { return response('Error al agregar usuario en MySQL: ' . $e->getMessage(), 500); // Manejo de errores mejorado } } /** * Obtiene la lista de usuarios de la base de datos MySQL * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // Recupera todos los usuarios de la base de datos MySQL $users = Db::connection('mysql')->table('users')->get(); // Devuelve la lista formateada en JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Especificar Content-Type } catch (\Exception $e) { return response('Error al obtener usuarios de MySQL: ' . $e->getMessage(), 500); // Manejo de errores mejorado } } /** * Agrega un usuario a la base de datos PostgreSQL * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // Conecta a PostgreSQL e inserta el usuario Db::connection('pgsql')->table('users')->insert([ 'name' => 'Usuario PgSQL de ServBay Webman', // Datos de ejemplo actualizados 'email' => 'pgsql_demo@servbay.test', // Correo de ejemplo actualizado 'created_at' => date('Y-m-d H:i:s') // Se añade created_at ]); return response('Usuario agregado a PostgreSQL'); // Mensaje actualizado } catch (\Exception $e) { return response('Error al agregar usuario en PostgreSQL: ' . $e->getMessage(), 500); // Manejo de errores mejorado } } /** * Obtiene la lista de usuarios de la base de datos PostgreSQL * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // Recupera todos los usuarios de la base de datos PostgreSQL $users = Db::connection('pgsql')->table('users')->get(); // Devuelve la lista formateada en JSON return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Especificar Content-Type } catch (\Exception $e) { return response('Error al obtener usuarios de PostgreSQL: ' . $e->getMessage(), 500); // Manejo de errores mejorado } } }1
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Configura la conexión a la base de datos
Edita el archivo
config/database.phpen la raíz del proyecto configurando la conexión a MySQL y PostgreSQL. El host predeterminado es127.0.0.1, los puertos son3306(MySQL) y5432(PostgreSQL), y la contraseña del usuariorootespassword.php<?php /** * Configuración de base de datos */ return [ // Conexión por defecto 'default' => 'mysql', // Lista de conexiones 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // Host y puerto MySQL por defecto en ServBay 'host' => '127.0.0.1', 'port' => 3306, // Nombre de la base de datos creada antes 'database' => 'webman_app', // Usuario por defecto de ServBay MySQL 'username' => 'root', // Contraseña predeterminada de ServBay MySQL 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // Host y puerto PostgreSQL por defecto en ServBay 'host' => '127.0.0.1', 'port' => 5432, // Nombre de la base de datos creada antes 'database' => 'webman_app', // Usuario por defecto de ServBay PostgreSQL 'username' => 'root', // Contraseña predeterminada de ServBay PostgreSQL 'password' => 'password', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', // O require, verify-ca, verify-full ], // Puedes agregar más conexiones aquí... ], ];1
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
46Aviso importante: En un entorno de producción, asegúrate de cambiar la contraseña predeterminada y evita guardar información sensible en el código fuente.
Ejecutar el proyecto Webman
Generalmente, un proyecto Webman se inicia mediante el script start.php, el cual arranca los procesos de Workerman. Esto difiere de la manera tradicional con Nginx/Apache + PHP-FPM; Webman es una aplicación asíncrona residente en memoria.
En el directorio raíz del proyecto (/Applications/ServBay/www/servbay-webman-app), ejecuta el siguiente comando para iniciar Webman:
php start.php startTras ejecutar el comando, deberías ver el mensaje de inicio de Webman, que por defecto escuchará peticiones HTTP en 127.0.0.1:8787.
- Nota: El comando
phpque utilices es el que proporciona el entorno de ServBay. ServBay ajusta automáticamente el PATH de tu terminal para que uses la versión de PHP instalada en ServBay. - Para ejecutar Webman en segundo plano, añade el parámetro
-d:php start.php start -d. - Para detener el servicio de Webman, ejecuta:
php start.php stop. - Para reiniciar Webman, ejecuta:
php start.php restart. - Para recargar suavemente (sin interrumpir las conexiones actuales):
php start.php reload.
Probar el proyecto
Una vez que Webman esté corriendo y escuchando en 127.0.0.1:8787, puedes acceder a las siguientes URLs desde tu navegador para probar cada funcionalidad:
http://localhost:8787/: Verás la salida¡Hola ServBay & Webman!.http://localhost:8787/memcached: Debería mostrar¡Hola Memcached desde ServBay!. Esto indica que la integración con Memcached vía Webman funciona.http://localhost:8787/redis: Debería mostrar¡Hola Redis desde ServBay!. Éxito en la conexión y uso de Redis.http://localhost:8787/mysql-add: Verás el mensajeUsuario agregado a MySQL. Se insertará un registro en la tablausersde la base creada anteriormente en MySQL.http://localhost:8787/mysql: Mostrará en formato JSON la lista de usuarios de la tablausersde MySQL.http://localhost:8787/pgsql-add: El mensajeUsuario agregado a PostgreSQLconfirmará la inserción en la tabla respectiva de PostgreSQL.http://localhost:8787/pgsql: Mostrará la lista de usuarios en formato JSON desde PostgreSQL.
Si encuentras algún problema al acceder a estas URL, revisa la salida en la terminal de Webman para mensajes de error y asegúrate de que los servicios MySQL, PostgreSQL, Redis y Memcached están en marcha, así como que las extensiones PHP necesarias están activadas.
Preguntas frecuentes (FAQ)
- P: ¿No encuentra el comando
php start.php start?- R: Asegúrate de haber ejecutado
cdpara situarte en el directorio del proyectoservbay-webman-appen la terminal. Verifica que la PHP de ServBay esté correctamente en el PATH (ServBay suele configurarlo automáticamente).
- R: Asegúrate de haber ejecutado
- P: ¿Al acceder a
localhost:8787aparece error de conexión?- R: Verifica mensajes de error en la terminal al ejecutar
php start.php start. Asegúrate de que el puerto8787no esté ocupado. Si lo está, puedes cambiar el puerto en el archivo de configuración de Webman (por ejemplo, enconfig/server.php).
- R: Verifica mensajes de error en la terminal al ejecutar
- P: ¿Error de conexión a la base de datos?
- R: Comprueba que los servicios de MySQL y PostgreSQL de ServBay estén activos. Revisa
config/database.php(host, puerto, nombre de base, usuario y contraseña) y asegúrate de que coincidan con la configuración de ServBay (por defecto usuarioroot, contraseñapassword) y de que has creado la base y la tablausers.
- R: Comprueba que los servicios de MySQL y PostgreSQL de ServBay estén activos. Revisa
- P: ¿Error de conexión a Memcached o Redis?
- R: Revisa si los servicios de Memcached y Redis de ServBay están en marcha. Verifica las direcciones y puertos en
app/controller/CacheController.php(por defecto127.0.0.1:11211y127.0.0.1:6379). Asegúrate de tener habilitadas las extensionesmemcachedyredisen PHP.
- R: Revisa si los servicios de Memcached y Redis de ServBay están en marcha. Verifica las direcciones y puertos en
Resumen
Siguiendo estos pasos, has creado, configurado y ejecutado con éxito un proyecto básico de Webman en el entorno de desarrollo local de ServBay. Aprendiste a aprovechar los servicios integrados de ServBay para montar fácilmente el entorno de desarrollo de Webman, así como la integración de bases de datos y caché. Las capacidades de alto rendimiento de Webman, combinadas con la conveniencia de ServBay, ofrecen una potente plataforma para el desarrollo de aplicaciones PHP asíncronas. Esperamos que esta guía te ayude a sacar el máximo partido a ServBay y Webman para construir excelentes aplicaciones web.
