Louder Developer Zone
Articles, Tutorials and Tips from the community and Louder developers

Presentando Hurricane Web Server

Publish at Sunday, March 07, 2010
By Core Developers - Louder

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:

  1. El cliente HTTP (navegador) realiza una petición
  2. Si esta es de PHP entonces se pasa la petición al interprete
  3. Si se usa reescritura de URLs entonces estas se procesan y se pasan al PHP previamente
  4. 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)
  5. La petición es atendida por el framework
  6. El framework genera una respuesta de algun tipo que es enviada por PHP al servidor web
  7. 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:

php scripts/server.php --address 0.0.0.0 --port 8080

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:



blog comments powered by Disqus

Colaborate

Colaborate

We invite you to submit articles and tutorials to the Developer Zone.

Archive

  • Mayo 2009

Maybe you are interested

Added value to your Business.

Become a Solution Partner Louder Now.

Bring to the Open-Source retroactively..

Learn more about Shared Louder Labs