"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Construya un servidor PHP súper rápido en minutos con Icicle

Construya un servidor PHP súper rápido en minutos con Icicle

Publicado el 2025-03-24
Navegar:358

La programación basada en eventos presenta un desafío único para los desarrolladores de PHP acostumbrados a la codificación de procedimientos. En la naturaleza de procedimiento de PHP, los eventos a menudo se reducen a llamadas de funciones simples, sin un comportamiento asincrónico inherente. Toda la ejecución del código sigue bloqueando.

Sin embargo, los idiomas como JavaScript demuestran el potencial de los bucles de eventos como un componente central. Esta idea ha llevado a los desarrolladores a integrar bucles de eventos y capacidades asincrónicas en servidores PHP HTTP. Este artículo demuestra la construcción de un servidor PHP HTTP de alto rendimiento que aprovecha la biblioteca Icicle e integra con Apache para una entrega de archivos estáticos optimizados. El código de ejemplo está disponible en https://github.com/sitePoint-editors/icicle-http-server .

Build a Superfast PHP Server in Minutes with Icicle

Key ventajas

  • La potencia asíncrona de Icicle: Las capacidades de programación asíncrona de Icicle habilitan la creación de un servidor PHP notablemente rápido. El manejo de solicitudes concurrentes aumenta significativamente el rendimiento.
  • Apache Integration para archivos estáticos: descarga eficientemente el archivo estático que sirve a Apache, dejando que el servidor de Icicle PHP maneje las solicitudes dinámicas.
  • mejoras de enrutamiento y plantilla: que extiende el servidor básico con un enrutador (como League \ Route) permite el manejo y el enrutamiento de solicitudes sofisticadas. Un motor de plantilla (como League \ Plates) agrega características como diseños y herencia de plantilla para aplicaciones complejas.

Configuración de Apache para el archivo estático optimizado que sirve

Para evitar el procesamiento de PHP innecesario para archivos estáticos, configure Apache para servirlos directamente:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) http://%{SERVER_NAME}:9001%{REQUEST_URI} [P]

this mod_rewrite Configuration Dirige a Apache para reenviar solicitudes de archivos inexistentes a un puerto diferente (por ejemplo, 9001), donde el servidor de Icicle PHP las manejará.

un servidor http icículo básico

Comience instalando Icicle:

composer require icicleio/http

un ejemplo de servidor Icicle HTTP simple:

// server.php
require __DIR__ . "/vendor/autoload.php";

use Icicle\Http\Message\RequestInterface;
use Icicle\Http\Message\Response;
use Icicle\Http\Server\Server;
use Icicle\Loop;
use Icicle\Socket\Client\ClientInterface;

$server = new Server(function (RequestInterface $request, ClientInterface $client) {
    $response = (new Response(200))->withHeader("Content-Type", "text/plain");
    yield $response->getBody()->end("hello world");
    yield $response;
});

$server->listen(9001);
Loop\run();

enrutamiento avanzado con liga \ ruta

Para un enrutamiento más robusto, integrar la liga \ ruta:

composer require league/route

mejorado server.php con enrutamiento:

// server.php
// ... (previous imports) ...
use League\Route\Http\Exception\MethodNotAllowedException;
use League\Route\Http\Exception\NotFoundException;
use League\Route\RouteCollection;
use League\Route\Strategy\UriStrategy;

// ... (Server creation) ...

    $router = new RouteCollection();
    $router->setStrategy(new UriStrategy());
    require __DIR__ . "/routes.php";
    $dispatcher = $router->getDispatcher();

    try {
        $result = $dispatcher->dispatch($request->getMethod(), $request->getRequestTarget());
        $status = 200;
        $content = $result->getContent();
    } catch (NotFoundException $e) {
        $status = 404;
        $content = "not found";
    } catch (MethodNotAllowedException $e) {
        $status = 405;
        $content = "method not allowed";
    }

    // ... (Response creation and sending) ...

una muestra rutes.php :

$router->addRoute("GET", "/home", function () {
    return "hello world";
});

representando vistas complejas con la liga \ plates

Para vistas complejas, use la liga \ plates:

composer require league/plates

implementando plantilla (ejemplo de fragmentos de plantplates/layout.php y Templates/home.php , y actualizado rutes.php se omiten para la brevedad, pero siga la estructura del ejemplo original).

Rendimiento Benchmarks and Conclusion

El artículo original incluye puntos de referencia de rendimiento que demuestran la capacidad del servidor para manejar un número significativo de solicitudes concurrentes. Estos puntos de referencia deben considerarse en el contexto del hardware y las condiciones específicos bajo las cuales se ejecutaron. La conclusión clave es el potencial de alto rendimiento con el modelo asíncrono de Icicle. El artículo concluye alentando la experimentación y la discusión comunitaria. También se incluyen los puntos de referencia actualizados proporcionados por el autor Icicle. La sección Preguntas frecuentes aclara aún más varios aspectos del uso de Icicle para el desarrollo del servidor.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3