2010-10-15 10 views
5

Estoy buscando la posibilidad de verificar la velocidad de conexión del usuario. Se supone que debe guardarse como una cookie y los archivos javascript y los archivos css se adaptarán si la velocidad es lenta.Prueba de velocidad de PHP para la velocidad de conexión del usuario sin eco en la página actual

La posibilidad de que la velocidad de las pruebas que tengo en este momento no está en la siguiente

$kb = 512; 

    flush(); 
    // 
    echo "<!-"; 
    $time = explode(" ",microtime()); 
    for($x=0;$x<$kb;$x++){ 
     echo str_pad('', 512, '.'); 
     flush(); 
    } 
    $time_end = explode(" ",microtime()); 
    echo "->"; 

    $start = $time[0] + $time[1]; 
    $finish = $time_end[0] + $time_end[1]; 
    $deltat = $finish - $start; 

    return round($kb/$deltat, 3); 

Mientras que funciona, que no me gusta de él para poner tantos personajes en mi código también si me hago eco de todo esto no puedo guarde el resultado en una cookie porque ya ha habido una salida.

¿Se podría hacer algo como esto en un archivo diferente? ¿Tienes alguna solución?

Gracias de antemano.

+0

Creo que no es posible con php prima. – fabrik

+0

cuál es el str_pad() que agrega 512. ¿usado para? –

+0

Mala idea; no puedes hacer esto con precisión, y aunque pudieras, no deberías hacerlo. Lo que desea es una versión móvil de su sitio que sea de bajo ancho de banda y amigable con la pantalla pequeña, y brinde a los usuarios la * opción * de usar esa versión móvil. – meagar

Respuesta

6

¿Tiene alguna solución?

Mi solución es no molestar en absoluto con la prueba de velocidad. Aquí se explica por qué:

Usted indicó que el motivo de la prueba es determinar qué archivos JS/CSS enviar. Debe tener en cuenta que los navegadores guardarán en caché estos archivos después de la primera descarga (siempre que no se hayan modificado). Entonces, en efecto, está enviando 256K de datos de prueba para determinar si debe enviar, por ejemplo, 512K adicionales.

Simplemente envíe los datos y se almacenarán en caché. A menos que tenga MB de JS/CSS (en cuyo caso necesita un rediseño del sitio, no una prueba de velocidad), el tiempo de descarga será factible. Las pruebas de velocidad deben reservarse para cosas tales como la transmisión de video y similares.

+0

Bueno, eso realmente suena bien. La Idea fue más o menos para proporcionar esta versión si es necesario. El sistema que estoy construyendo es una base para muchas páginas web por venir y, si hubiera grandes fondos, sería bueno ofrecer al usuario la opción de tener una versión de bajo ancho de banda. Creo que lo haré manualmente, solo con 2 botones. Gracias por todas las respuestas, si alguna vez tengo que hacerlo, sé dónde buscar. –

1

El problema aquí es que no se puede resolver esto muy bien, y probablemente no en PHP puro. El enfoque que haya tomado hará que el usuario descargue (512x512) = 262 144 bytes de datos inútiles, que es mucho más grande que la mayoría de las páginas completas. Si el usuario tiene una conexión lenta, puede suponer que su sitio está inactivo antes de que finalice la prueba de velocidad (con 10 kB/seg., ¡Demoraría medio minuto antes de que aparezca algo interesante en la pantalla!).

Puede realizar una solicitud de AJAX para un archivo de un tamaño y un tamaño conocidos por el tiempo que toma. El problema aquí es que la página debe estar cargada para que funcione, por lo que solo funcionará para páginas posteriores.

Puede hacer una página de "carga" (como se ve en GMail cuando se accede desde una conexión lenta) que precarga los datos, con un enlace a la versión de bajo ancho de banda (o tal vez una redirección si se está cargando demasiado largo).

O podría guardar el tiempo de "inicio" en la cookie y hacer una solicitud AJAX cuando la página termine de cargarse; eso le daría el tiempo real de carga de su página; si eso es, por ejemplo, más de 10 segundos, es posible que desee cambiar a la versión de bajo ancho de banda.

Ninguno de estos, sin embargo, le dará la velocidad en el primer acceso; y enviar una gran página vacía por adelantado tampoco es una muy buena primera impresión.

+0

¿Y qué tan preciso es esto? – fabrik

+0

Necesita la velocidad ** antes ** de generar la página para que pueda elegir qué archivo CSS incluir. –

+0

@Alin Purcaru: díganos, ¿cómo obtienen la velocidad * antes * de descargar algo? – Piskvor

3

La única idea de lo que puedo hacer es redirigir.

  • Medida de velocidad
  • redirección al índice

Si bien esto no es una buena solución sólo se necesita medir la velocidad de los usuarios de los usuarios solamente una vez, así que creo que es excusable.

0

Después de determinar la velocidad del usuario, envíe javascript al navegador para configurar la cookie y luego realice una actualización o redirección en los casos en que la velocidad sea inferior a la que desea.

1

¿Qué le parece usar javascript para cronometrar cuánto tiempo lleva cargar una página. Luego usa javascript para configurar la cookie.

microtime en javascript http://phpjs.org/functions/microtime:472

Usando jQuery

<head> 
<!-- include jquery & other html snipped --> 

<script> 

function microtime (get_as_float) { 
    // http://kevin.vanzonneveld.net 
    // + original by: Paulo Freitas 
    // *  example 1: timeStamp = microtime(true); 
    // *  results 1: timeStamp > 1000000000 && timeStamp < 2000000000 

    var now = new Date().getTime()/1000; 
    var s = parseInt(now, 10); 

    return (get_as_float) ? now : (Math.round((now - s) * 1000)/1000) + ' ' + s; 
} 

function setCookie(c_name, value, expiredays) { 
var exdate=new Date(); 
exdate.setDate(exdate.getDate()+expiredays); 
document.cookie=c_name+ "=" +escape(value)+ 
((expiredays==null) ? "" : ";expires="+exdate.toUTCString()); 
} 

start = microtime(true); 

$(window).load(function() { 
    // everything finished loading 
    end = microtime(true); 
    diff = end - start; 
    // save in a cookie for the next 30 days 

    setCookie('my_speed_test_cookie', diff, 30); 
}); 

</script> 
</head> 
<body> 
<p>some page to test how long it loads</p> 
<img src="some_image_file.png"> 
</body> 

Algunos escollos: - La página tendría que comenzar a cargar en primer lugar. JQuery tendría que ser cargado (o puede reelaborar el código anterior para evitar jQuery)

  • velocidad de la prueba en los datos ASCII/América no puede dar los mejores resultados, ya que los personajes pueden quedar comprimido. Además de la compresión gzip de alto nivel, algunos módems/líneas (si no todos) tienen una compresión básica que puede detectar caracteres que se repiten y le dicen al otro extremo que los siguientes 500 se repiten de ''. Supongo que sería mejor utilizar datos binarios que se han comprimido
0

Lo único que se me ocurre es suscribirse a un servicio que ofrece una búsqueda de IP a velocidad de red. Estos servicios funcionan construyendo una base de datos de direcciones IP y catalogando su uso previsto registrado. No siempre son precisos, pero proporcionan un punto de partida. Busque la dirección IP del usuario contra uno de estos y vea lo que devuelve.

Ip2Location.com proporciona dicha base de datos, comenzando con su producto DB13.

Por supuesto, si su objetivo es una versión móvil del sitio, el rastreo de agente de usuario es una mejor solución.

1

visita la primera página (tal vez 100kB con todos los archivos externos), una sesión comienza inmemorialmente con $ _SESSION ["start_time"] = time();

cuando terminó de cargar la página (carga ventana de jQuery o Smth :) u envía una solicitud de nuevo con el tiempo, u calcular la velocidad (jQueryRequestTime - $ _SESSION [ "hora_inicial"]/PageSize) y establecer otra variable de sesión, el siguiente enlace se hace clic a continuación, puede incluir personalizados css/js autorizados a tal

OFC esto no se perect :)

Cuestiones relacionadas