PHP ha recorrido un largo camino y sigue mejorando con nuevas características, sintaxis y velocidad. El ecosistema también se está expandiendo, con muchos desarrolladores creando frameworks para simplificar la vida de otros desarrolladores. Existen frameworks populares y completos como Laravel y Symfony, así como microframeworks ligeros como FrameworkX.
Es un microframework ligero para PHP que utiliza una arquitectura de eventos no bloqueada, similar a Node.js, que es perfecta para aplicaciones de alta concurrencia y en tiempo real como aplicaciones de chat o notificaciones en vivo.
En este artículo, exploraremos qué es FrameworkX y cómo se diferencia de los frameworks PHP tradicionales. ¡Empecemos!
Comenzando
Primero, asegúrate de tener PHP y Composer configurados en tu computadora. Una vez instalado, puedes agregar FrameworkX a tu proyecto con este comando:
composer require clue/framework-x
FrameworkX no requiere una configuración compleja. Todo lo que necesitas es un archivo public/index.php. Aquí tienes un ejemplo básico para mostrar «¡Hola Mundo!» en la página de inicio:
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::plaintext("¡Hola Mundo!\n"));
$app->run();
Para ejecutar tu aplicación, escribe:
php public/index.php
Este comando inicia un servidor local usando el servidor integrado de PHP, respaldado por el componente ReactPHP Socket. No necesitas Nginx o Apache. Tu servidor se ejecutará en http://127.0.0.1:8080, y debería mostrar «¡Hola Mundo!».

Configuración del Servidor Localhost
Además del texto simple, también puedes devolver datos JSON. Por ejemplo:
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$users = [['name' => 'Jon Doe'], ['name' => 'Jane Doe']];
$app = new FrameworkX\App();
$app->get('/', fn () => \React\Http\Message\Response::json($users));
$app->run();
Operaciones Asíncronas
Las operaciones PHP generalmente son bloqueantes y sincrónicas, lo que significa que cada tarea debe finalizar antes de que comience la siguiente. FrameworkX está construido sobre la librería ReactPHP.
ReactPHP es una librería que proporciona componentes como EventLoop, Stream, Promise, Async, y HTTP, que permiten operaciones asíncronas. Por lo tanto, las tareas pueden ejecutarse de forma concurrente sin esperar a que otras terminen. Esto es ideal para manejar múltiples conexiones, solicitudes HTTP u operaciones de E/S simultáneamente.
En este ejemplo, hemos actualizado nuestro index.php para obtener una API. En lugar de usar las funciones curl_*, usaremos el componente HTTP para hacer una solicitud asíncrona.
$app = new FrameworkX\App();
$app->get('/', function () {
echo "Start\n";
(new \React\Http\Browser())
->get('https://www.codigonautas.com/wp-json/wp/v2/posts')
->then(function () {
echo "End (API)\n";
});
echo "End\n";
return \React\Http\Message\Response::plaintext("¡Hola Mundo!\n");
});
$app->run();
Normalmente, una solicitud de API externa bloquearía la renderización de la página hasta que la solicitud se complete. Sin embargo, con las operaciones asíncronas que maneja el componente HTTP de ReactPHP, la página se carga instantáneamente, como se evidencia en el registro.
→ php public/index.php
2024-07-18 07:40:03.778 Listening on http://127.0.0.1:8080
Start
End
2024-07-18 07:42:34.308 127.0.0.1 "GET / HTTP/1.1" 200 13 0.180
End (API)
Esto hace que FrameworkX sea capaz de manejar muchas más solicitudes concurrentes que las configuraciones PHP tradicionales, lo que acelera significativamente los tiempos de carga de las páginas. ¿Pero qué tan rápido es?
Velocidad
Probamos FrameworkX en un droplet básico y barato de DigitalOcean con 1 vCPU y 1 GB de RAM. Manejó alrededor de 4,000 solicitudes por segundo sin esfuerzo.
Concurrency Level: 50
Time taken for tests: 22.336 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 100000
Total transferred: 17400000 bytes
HTML transferred: 1300000 bytes
Requests per second: 4512.69 [#/sec] (mean)
Time per request: 11.411 [ms] (mean)
Time per request: 0.326 [ms] (mean, across all concurrent requests)
Transfer rate: 750.26 [Kbytes/sec] received
Incluso con carga de trabajo adicional, como operaciones de lectura de disco y renderizado de 100 listas desde un archivo JSON, aún logró alrededor de 2700 solicitudes por segundo.
Concurrency Level: 50
Time taken for tests: 36.381 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 100000
Total transferred: 296600000 bytes
HTML transferred: 280400000 bytes
Requests per second: 2848.72 [#/sec] (mean)
Time per request: 18.190 [ms] (mean)
Time per request: 0.324 [ms] (mean, across all concurrent requests)
Transfer rate: 7864.31 [Kbytes/sec] received
Estoy bastante seguro de que podría ser mucho más rápido con mejores especificaciones del servidor.
Conclusión
FrameworkX es un poderoso microframework ligero para PHP. Se ejecuta de forma asíncrona y es capaz de manejar múltiples tareas de manera eficiente, similar a Node.js. Es el framework perfecto tanto si estás construyendo una aplicación simple como una aplicación compleja de alta concurrencia o en tiempo real.