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 .
Key ventajas
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.
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