Evitar el pipelining de Firefox en nuestro servidor Apache

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

Artículos recientes

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.