2mdc
C/ Matias Turrión, 24, 1º
Madrid 28043
Tel: 91 759 00 24
Fax: 91 759 15 18

Blog: Desarrollo web

Evitar el pipelining de Firefox en nuestro servidor Apache

Publicado el: 7/07/2009 en: Desarrollo web | Añadir Comentario

Envía esta entrada a menéame Envía esta entrada a del.ici.ous Envía esta entrada a facebook Envía esta entrada a Twitter

Una de esas cosas que varían mucho según el cristal con el que se mira es el llamado pipelining. Esta técnica consiste básicamente en configurar el navegador Firefox para que al solicitar una página web realice no una, sino varias peticiones simultaneas de la misma URL. Estas peticiones crean un flujo de datos en paralelo que teóricamente incrementa la velocidad de descarga de la información solicitada.

Sin entrar a juzgar hasta que punto este truco es efectivo para nuestra navegación, sí que podemos afirmar que puede sobrecargar nuestro servidor innecesariamente. Una primera solución es la limitación del numero de conexiones admisibles por nuestra máquina desde cierta IP, pero imaginemos que tan sólo queremos limitar el número de peticiones a cierto script que realiza una tarea pesada, como un acceso a base de datos o un acceso a ficheros grandes en disco.

En nuestro caso tenemos un script que ejecuta una consulta sobre un join bastante pesado, la velocidad de respuesta es muy importante y no nos interesan retrasos en la respuesta. Hemos creado una función nopipeling usando la sesión para controlar cada petición y salir de la ejecución si estamos ante una petición múltiple en un corto espacio de tiempo.

# Control de peticiones al script.
# Por defecto el iexplore pide al servidor 2 veces la url. El firefox la pide 5, la primera de la url cargada actualmente
# y el resto la que hemos solicitado.
# Este script guarda en sesión las peticiones con misma url (incluida su query string) y si se produce en un intervalo
# menor al < $tiempo_cadencia> y más de < $peticiones_maximas> veces salimos de la ejecucion.
#

function nopipeling($peticiones_maximas=2,$tiempo_cadencia=2){

	# REGISTRO:
	$indice_peticion=$_SERVER["REQUEST_URI"];

	if(!isset($_SESSION['ID_SESION'][$indice_peticion])){
	//lo reseteo a cero para esta peticion si no existe en la sesion, inicializamos.
		$_SESSION['ID_SESION'][$indice_peticion]["n"]=1;
		$_SESSION['ID_SESION'][$indice_peticion]["t"]=mtime();

	}
	elseif((mtime() - $_SESSION['ID_SESION'][$indice_peticion]["t"]) > $tiempo_cadencia){
	//o si ha pasado al menos x segundos desde la ultima peticion, desbloqueamos, reinicializamos.
		$_SESSION['ID_SESION'][$indice_peticion]["n"]=1;
		$_SESSION['ID_SESION'][$indice_peticion]["t"]=mtime();

	}
	else{
	//incrementamos contador
		$_SESSION['ID_SESION'][$indice_peticion]["n"]=$_SESSION['ID_SESION'][$indice_peticion]["n"] + 1;

	}

	# FILTRADO:
	//si es la primera vez, continuo
	if($_SESSION['ID_SESION'][$indice_peticion]["n"] < ($peticiones_maximas+1)){

	}
	else{
	//si no es asi, salgo de ejecucion
		//solo considero la primera llamada con los parametros correctos - comun en firefox y explorer
		exit();

	}

}

Como siempre estáis invitados a modificar y adaptar el código libremente y por supuesto a comentar que os parece la idea.

Valore de 1 a 5 este artículo
1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (2 voto(s), media: 3.50 sobre 5)

Deja tu comentario



Tags HTML Permitidos:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

2mdc.com Aplicaciones web C/ Matias Turrión, 24, 1º, Madrid 28043 Tel: 91 759 00 24 Fax: 91 759 15 18 Aplicaciones web