Programación asíncrona en PHP: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course
Here is the translated HTML content from Russian to Spanish, keeping all HTML tags and only translating the text content inside them. ```html

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