La próxima versión de Kumbia Enterprise Framework (KEF) 1.7.1 incluye importantes novedades, una de las más sobresalientes es la inclusión de HurricaneServer. Este es un servidor web escrito desde cero y diseñado especificamente para estar integrado completamente con Kumbia Enterprise.
La arquitectura de KEF fue diseñada para que funcionara como un contenedor de aplicaciones independiente ó en llave con un servidor web como Apache ó IIS en la forma tradicional como trabajan los frameworks para PHP.
Recordemos la integración de KEF con IBM Websphere Smash en la cuál trabaja como contenedor de aplicaciones, sin embargo Smash no está disponible en muchos servidores y no se habia podido explotar toda la capacidad del framework en este sentido.
HurricaneServer viene incluido con la versión 1.7.1 y basicamente permite "levantar" cualquier instancia del framework como un servidor web. El resultado es impresionante y revolucionario.
Arquitectura de HurricaneServer
La idea detrás de HurricaneServer es que el framework no "duerma". Todos los frameworks MVC para PHP funcionan de la siguiente forma:
El cliente HTTP (navegador) realiza una petición
Si esta es de PHP entonces se pasa la petición al interprete
Si se usa reescritura de URLs entonces estas se procesan y se pasan al PHP previamente
El framework carga los archivos que requiera y realiza las inicializaciones del caso
(conectarse a base de datos, cargar componentes, abrir archivos de configuración, cargar plugins, etc)
La petición es atendida por el framework
El framework genera una respuesta de algun tipo que es enviada por PHP al servidor web
Todas las clases cargadas, archivos, conexiones y demás se eliminan de la memoria ó se cierran
En cada petición el proceso anterior se realiza una y otra vez. Los pasos del 3 al 7 son los más críticos, todo el trabajo que constituye inicializar el framework se pierde al final de la petición gastando muchos recursos al repitir las mismas tareas una y otra vez.
HurricaneServer funciona como un web server normal, solo que en cada nueva petición ya está cargada cualquier clase, conexión, recurso, etc que hayan sido usados anteriormente en otra petición. En el caso de KEF implica que:
Las clases de controladores, modelos y componentes ya están listos para usarse sin que el framework deba buscar
el archivo que los contiene y cargar el contenido del archivo en cada petición
La conexión a la BD siempre es la misma, mucho más efectivo que usar una conexión persistente.
Las conexiones persistentes deben ser recreadas como recursos PHP al iniciar cada petición.
Las sesiones no son escritas en disco al terminar cada petición sino que están disponibles en
datos nativos de PHP cuando se necesiten
Los meta-datos de los modelos están listos para cualquier
petición en datos nativos de PHP en todo momento
El estado de los controladores se mantiene entre una petición y otra
Manejadores de archivos y otros recursos estan abiertos entre una petición a otra hasta que el usuario los cierre.
Las ventajas son muchas el rendimiento y velocidad de las aplicaciones es el más beneficiado sin lugar a dudas.
Características de HurricaneServer
HurricaneServer no pretende soportar todas las características de un servidor web de renombre como Apache.
Se ha implementado lo que consideramos es el "básico" de toda aplicación web de mediano y pequeño tamaño.
El servidor web puede hacer lo siguiente:
Recibir y atender peticiones con métodos POST y GET
Convertir parámetros enviados por GET y POST a las superglobales $_GET, $_POST y $_REQUEST
Alimentar los encabezados y entorno de la petición en $_SERVER
Enviar y mantener la cookie de seguimiento de sesión PHPSESSID
Soporta encabezados HTTP como Expires, If-Modified-Since, Last-Modified, Cache-Control para mejorar el rendimiento
Recibe archivos por POST y los alimenta en $_FILES
Servir contenido estático (css, javascript, imágenes, etc) y también dinámico (php)
Conexiones bajo TCP/IP IPv4
Comparación de rendimiento
A continuación vamos a hacer una comparación de rendimiento entre HurricaneServer y Apache/2.2.3 para ser
tenida en cuenta en forma de referencia.
Para las pruebas se usó la siguiente maquina:
Sistema Operativo: OpenSuSE 11.2 (Kernel 2.6.31.8-0.1-default) Procesador: Intel Core Duo 2.4 Ghz Memoria: 2GB DDR3 SDRAM
Apache Web Server v2.2.3 con PHP 5.3.1 (como modulo) Hurricane Web Server v0.1 con PHP v5.3.1
Kumbia Enterprise Framework v1.7.1
1. Primera Prueba. Servir contenido estático
Se realizaron 100 peticiones solicitando contenido estático (una imagen GIF de 53 bytes) bajo la raíz de documentos de KEF tanto en Apache como en Hurricane.
Resultados en Apache:
[~ #] ab2 -n 100 http://127.0.0.1/kef/img/prev.gif
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: Apache/2.2.13
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /kef/img/prev.gif
Document Length: 53 bytes
Concurrency Level: 1
Time taken for tests: 0.178868 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 30000 bytes
HTML transferred: 5300 bytes
Requests per second: 559.07 [#/sec] (mean)
Time per request: 1.789 [ms] (mean)
Time per request: 1.789 [ms] (mean, across all concurrent requests)
Transfer rate: 162.13 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 1 11.1 0 111
Waiting: 0 1 11.1 0 111
Total: 0 1 11.1 0 111
Resultados en Hurricane
[~ #] ab2 -n 100 http://127.0.0.1:8080/img/prev.gif
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: HurricaneServer/0.1
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /img/prev.gif
Document Length: 53 bytes
Concurrency Level: 1
Time taken for tests: 0.163754 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 27700 bytes
HTML transferred: 5300 bytes
Requests per second: 610.67 [#/sec] (mean)
Time per request: 1.638 [ms] (mean)
Time per request: 1.638 [ms] (mean, across all concurrent requests)
Transfer rate: 164.88 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 1 1 0.4 1 3
Waiting: 0 0 0.6 0 3
Total: 1 1 0.4 1 3
En promedio Apache puede atender 559.07 peticiones por segundo mientras que Hurricane puede atender es de 610.67 aproximadamente 0.10 veces más rápido. Aquí la diferencia no es mayor.
2. Segunda Prueba. Servir contenido dinámico
Se realizaron 100 peticiones solicitando un archivo en PHP bajo la raíz de documentos de KEF.
El archivo PHP imprime la fecha actual:
<?php echo date("Y-m-d H:i");
Resultados en Apache:
[~ #] ab2 -n 100 http://127.0.0.1:8080/kef/test.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: Apache/2.2.13
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /kef/test.php
Document Length: 16 bytes
Concurrency Level: 1
Time taken for tests: 0.666351 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 18100 bytes
HTML transferred: 1600 bytes
Requests per second: 150.07 [#/sec] (mean)
Time per request: 6.664 [ms] (mean)
Time per request: 6.664 [ms] (mean, across all concurrent requests)
Transfer rate: 25.51 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 0 6 55.6 1 557
Waiting: 0 5 55.7 0 557
Total: 0 6 55.6 1 557
Resultados en Hurricane:
[~ #] ab2 -n 100 http://127.0.0.1:8080/test.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: HurricaneServer/0.1
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /test.php
Document Length: 16 bytes
Concurrency Level: 1
Time taken for tests: 0.157159 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 19000 bytes
HTML transferred: 1600 bytes
Requests per second: 636.30 [#/sec] (mean)
Time per request: 1.572 [ms] (mean)
Time per request: 1.572 [ms] (mean, across all concurrent requests)
Transfer rate: 114.53 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 1 1 3.9 1 40
Waiting: 0 0 2.8 0 28
Total: 1 1 3.9 1 40
En el caso del contenido dinámico normal, en promedio, Apache puede atender 150.07 peticiones por segundo mientras que Hurricane puede atender es de 636.30, aproximadamente 4.2 veces más rápido. Aquí la diferencia es notable.
2. Tercera Prueba. Servir una petición a una aplicación
Se realizaron 100 peticiones solicitando una petición a una acción que inserta un valor en una columna.
El controlador tiene el siguiente código:
<?php
class TestController extends ApplicationController {
public function testAction(){
$prueba = new Prueba();
$prueba->campo2 = "valor";
$prueba->save();
}
}
Resultados en Apache
[~ #] ab2 -n 100 http://127.0.0.1:8080/kef/test/test
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: Apache/2.2.13
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /kef/test/test
Document Length: 929 bytes
Concurrency Level: 1
Time taken for tests: 2.870308 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 135600 bytes
HTML transferred: 92900 bytes
Requests per second: 34.84 [#/sec] (mean)
Time per request: 28.703 [ms] (mean)
Time per request: 28.703 [ms] (mean, across all concurrent requests)
Transfer rate: 45.99 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 27 28 3.1 27 50
Waiting: 26 27 3.2 27 49
Total: 27 28 3.1 27 50
Resultados en Hurricane
[~ #] ab2 -n 100 http://127.0.0.1:8080/test/test
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient).....done
Server Software: HurricaneServer/0.1
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /test/test
Document Length: 880 bytes
Concurrency Level: 1
Time taken for tests: 0.452552 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 111500 bytes
HTML transferred: 88000 bytes
Requests per second: 220.97 [#/sec] (mean)
Time per request: 4.526 [ms] (mean)
Time per request: 4.526 [ms] (mean, across all concurrent requests)
Transfer rate: 238.65 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 3 3 6.2 3 65
Waiting: 3 3 6.1 3 64
Total: 3 3 6.2 3 65
Al servir peticiones a aplicaciones, Apache en promedio tuvo 34.84 peticiones por segundo mientras que Hurricane tuvo 220.97/seg, osea 6.5 veces más rápido.
Que no hace HurricaneServer
HurricaneServer no está pensado en soportar cargas superiores a 128 peticiones simultáneas y manejar más de 1024 sesiones en memoria. Para aplicaciones pequeñas y medianas estos limites son adecuados.
Algunas de las caracteristicas que no son soportadas por el momento son:
Conexiones seguras SSL y certificados
Compresión de la salida usando gzip ó deflate
Resúmen de descargas
Otros métodos HTTP menos comunes como HEAD, OPTIONS ó PUT
Conexiones mediante IPv6 ó pipes Unix/Windows
Las operaciones a nivel TCP/IP se realizan en modo de bloqueo por lo que no es recomendado utilizarlo para descargar archivos grandes (más de 25MB)./p>
Entornos de ejecución
HurricaneServer tiene en cuenta el modo (production, development, test) en el que se encuentra la aplicación y asi generar optimizaciones como cacheo agresivo y otras. Los entornos se configuran en el archivo config/config.ini.
Ejecutar HurricaneServer
En cualquier instancia de KEF versión igual ó superior a 1.7.1 se ejecuta:
En este momento HurricaneServer es preciso para probar Kumbia Enterprise sin requerir de Apache ó otro servidor web.
Con HurricaneServer, Kumbia Enterprise se convierte en un framework que requiere cero configuración en todo el sentido de la palabra
Licencia de HurricaneServer
HurricaneServer es liberado bajo licencia abierta New BSD la misma de Kumbia Enterprise.
Tell friends about this article on social networks: