Introducción a la programación asíncrona en PHP
Tradicionalmente, PHP se considera un lenguaje síncrono: cada solicitud se ejecuta secuencialmente, bloqueando la ejecución hasta que se completa una operación (por ejemplo, una consulta a la base de datos o una API). Sin embargo, con el aumento de los requisitos de rendimiento de las aplicaciones web, la programación asíncrona en PHP es cada vez más demandada. El código asíncrono permite ejecutar múltiples tareas simultáneamente, sin esperar a que cada una termine, lo que acelera significativamente el procesamiento de solicitudes y reduce la carga en el servidor.
En esta guía, analizaremos los conceptos básicos de la programación asíncrona en PHP, revisaremos bibliotecas populares (ReactPHP, Amp), así como las capacidades modernas del lenguaje: Fiber y generadores.
Fundamentos de la asincronía: Event Loop y E/S no bloqueante
En el corazón de cualquier enfoque asíncrono se encuentra el Event Loop (bucle de eventos). Es un bucle infinito que verifica si ha ocurrido algún evento (por ejemplo, si se ha completado una solicitud HTTP o la lectura de un archivo). Si ocurre un evento, se ejecuta el manejador correspondiente. Mientras tanto, el hilo principal no se bloquea; puede cambiar a otra tarea.
E/S no bloqueante (Non-blocking I/O) es un principio clave. En código síncrono, la llamada a file_get_contents() bloquea la ejecución del script hasta que el archivo se carga por completo. En modo asíncrono, inicias la operación y continúas ejecutando otro código, y el resultado llega a través de un callback o una Promise.
Ejemplo: solicitud síncrona vs asíncrona
// Código síncrono (bloqueante)$start = microtime(true);$data1 = file_get_contents('http://example.com/api1');$data2 = file_get_contents('http://example.com/api2');echo "Tiempo de ejecución: " . (microtime(true) - $start) . " seg"; // ~2 seg (si cada solicitud toma 1 seg)
// Código asíncrono (ReactPHP)$loop = React\\EventLoop\\Factory::create();$client = new React\\Http\\Browser($loop);
$promise1 = $client->get('http://example.com/api1');$promise2 = $client->get('http://example.com/api2');
$promise1->then(function ($response) { echo "Respuesta 1 recibida";});$promise2->then(function ($response) { echo "Respuesta 2 recibida";});
$loop->run();// Tiempo de ejecución ~1 seg (las solicitudes se ejecutan en paralelo)Bibliotecas para programación asíncrona en PHP
Hoy en día, las dos bibliotecas más populares son ReactPHP y Amp. Ambas proporcionan un Event Loop, Promise y componentes listos para trabajar con HTTP, sockets y el sistema de archivos.
ReactPHP
ReactPHP es una biblioteca madura que existe desde 2012. Proporciona acceso de bajo nivel al bucle de eventos y muchos componentes: react/socket, react/http, react/dns y otros.
// Ejemplo de servidor HTTP con ReactPHP$loop = React\\EventLoop\\Factory::create();$server = new React\\Http\\Server($loop, function (Psr\\Http\\Message\\ServerRequestInterface $request) { return new React\\Http\\Message\\Response( 200, ['Content-Type' => 'text/plain'], "Hello, Async World!" );});$socket = new React\\Socket\\Server('127.0.0.1:8080', $loop);$server->listen($socket);echo "Servidor iniciado en http://127.0.0.1:8080";$loop->run();Amp
Amp utiliza corrutinas (corrutinas basadas en generadores) y proporciona una API de más alto nivel. En lugar de cadenas de then(), usas yield y await, lo que hace que el código se parezca al síncrono.
// Ejemplo con Amp\\Amp\\Loop::run(function () { $response = yield \\Amp\\Http\\Client\\HttpClient::request('http://example.com'); $body = yield $response->getBody()->buffer(); echo $body;});Fiber: asincronía en el núcleo de PHP 8.1
A partir de PHP 8.1, se agregaron al lenguaje los
Blogs
Book Recommendations
Leer también
Introducción a C# 2025: por dónde empezar para un principiante desde cero
Generics en Kotlin: para qué sirven y cómo usarlos: para principiantes
Procesamiento de Big Data en PHP: misión posible (y no da tanto miedo)
KaptExecution en Kotlin: qué se esconde detrás del error de Gradle
Trabajo con JSON en C++: análisis y serialización en la práctica