2010-10-15 8 views
5

Sto cercando la possibilità di verificare la velocità di connessione dell'utente. Dovrebbe essere salvato come un cookie e i file javascript così come i file CSS saranno adattati se la velocità è lenta.Test di velocità PHP per velocità di connessione utente senza eco nella pagina corrente

La possibilità per la velocità di prova ho al momento IST il seguente

$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); 

Mentre lavora, non mi piace mettere così tanti personaggi nel mio codice anche se mi associo tutto questo non posso salva il risultato in un cookie perché c'è già stato un risultato.

Si potrebbe fare qualcosa di simile in un file diverso? Avete qualche soluzione?

Grazie in anticipo.

+0

penso che non è possibile con php crudo. – fabrik

+0

qual è lo str_pad() che aggiunge 512. usato per? –

+0

Cattiva idea; non puoi farlo con precisione, e anche se tu potessi, non dovresti. Quello che vuoi è una versione mobile del tuo sito che sia a bassa larghezza di banda e con piccolo schermo e offra agli utenti l'opzione * * di utilizzare quella versione mobile. – meagar

risposta

6

Avete qualche soluzione?

La mia soluzione è di non preoccuparmi del test di velocità. Ecco perché:

Hai dichiarato che il motivo del test è determinare quali file JS/CSS inviare. È necessario tenere presente che i browser memorizzeranno nella cache questi file dopo il primo download (a condizione che non siano stati modificati). Quindi, in effetti, stai inviando 256K di dati di test per determinare se dovresti inviare, per esempio, un ulteriore 512K?

Basta inviare i dati e verrà memorizzato nella cache. A meno che non si disponga di MB di JS/CSS (nel qual caso è necessaria una riprogettazione del sito, non un test di velocità) il tempo di download sarà possibile. I test di velocità dovrebbero essere riservati per cose come lo streaming video e simili.

+0

Beh, sembra davvero giusto. L'idea era più o meno quella di fornire questa versione se ce n'è bisogno. Il sistema che sto costruendo è una base per molte pagine Web e se ci sarebbero grandi background e tali potrebbero essere utili per fornire all'utente la possibilità di avere una versione a bassa larghezza di banda. Penso che lo farò manualmente, fornendo solo 2 pulsanti. Grazie per tutte le risposte, se mai avrò bisogno di farlo, so dove guardare. –

1

Il problema qui è che non si può veramente risolvere questo problema, e probabilmente non in puro PHP. L'approccio che hai adottato farà scaricare all'utente (512x512) = 262 144 byte di dati inutili, che è molto più grande della maggior parte delle pagine complete. Se l'utente è in una connessione lenta, è possibile che il tuo sito non sia attivo prima che il test di velocità sia terminato (con 10 kB/sec, ci vorrebbe mezzo minuto prima che si mostri qualcosa di interessante sullo schermo!).

È possibile effettuare una richiesta AJAX per un file di una dimensione nota e tempo per quanto tempo quello prende. Il problema qui è che la pagina deve essere già caricata affinché funzioni, quindi funzionerà solo per le pagine successive.

Si potrebbe creare una pagina di "caricamento" (come si vede su GMail quando si accede da una connessione lenta) che precarica i dati, con un collegamento alla versione a larghezza ridotta (o forse un reindirizzamento se il caricamento sta prendendo troppo lungo).

Oppure è possibile salvare il tempo di "inizio" nel cookie e fare una richiesta AJAX al termine del caricamento della pagina - ciò consentirebbe il tempo di caricamento effettivo della pagina; se è, per esempio, più di 10 secondi, è possibile passare alla versione a larghezza di banda ridotta.

Nessuno di questi, tuttavia, ti darà la velocità al primo accesso; e l'invio di una grande pagina vuota non è una buona prima impressione.

+0

E quanto è preciso? – fabrik

+0

Ha bisogno della velocità ** prima ** generando la pagina in modo che possa scegliere quale file CSS includere. –

+0

@Alin Purcaru: dire, come si ottiene la velocità * prima * si scarica qualcosa? – Piskvor

3

L'unica idea di ciò che posso venire è un reindirizzamento.

  • Misura velocità
  • Redirect all'indice

Mentre questa non è una soluzione bello solo bisogno di misurare gli utenti degli utenti velocità solo una volta in modo da penso che sia scusabile.

0

Dopo aver determinato la velocità dell'utente, inviare javascript al browser per impostare il cookie e quindi eseguire un aggiornamento o un reindirizzamento nei casi in cui la velocità è inferiore a ciò che si desidera.

1

Come utilizzare il javascript per calcolare il tempo necessario per caricare una pagina. Quindi usa javascript per impostare il cookie.

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

utilizzando 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> 

alcune insidie: - La pagina avrebbe bisogno di iniziare a caricare prima. JQuery avrebbe bisogno di essere caricato (o si può rielaborare il codice di cui sopra per evitare di jQuery)

  • velocità di prova su dati ASCII/Latina non possono dare il miglior risultato, perché i personaggi possono ottenere compressa. Oltre alla compressione gzip di alto livello, alcuni modem/linee (se non tutti) hanno una compressione di base che è in grado di rilevare i caratteri ripetuti e dire all'altro capo che i successivi 500 sono ripetuti di "". Credo che sarebbe meglio usare dati binari che sono stati compressi
0

L'unica cosa che posso pensare sarebbe quella di iscriversi a un servizio che offre un IP per la ricerca della velocità di rete. Questi servizi funzionano creando un database di indirizzi IP e catalogando il loro uso previsto registrato. Non sono sempre precisi, ma forniscono un punto di partenza. Cerca l'indirizzo IP dell'utente contro uno di questi e guarda cosa restituisce.

Ip2Location.com fornisce un tale database, a partire dal prodotto DB13.

Ovviamente, se il tuo obiettivo è una versione mobile del sito, lo user agent sniffing è una soluzione migliore.

1

si visita la prima pagina (forse 100kB con tutti i file esterni), una sessione viene immancabilmente avviata con $ _SESSION ["start_time"] = time();

quando la pagina terminato il caricamento (load finestra jQuery o si dovrebbe occupare :) u invia una richiesta di nuovo con il tempo, u calcolare la velocità (jQueryRequestTime - $ _SESSION [ "START_TIME"]/PageSize) e impostare un'altra variabile di sessione, il prossimo Link fa clic quindi può includere personalizzati css/js autorizzati a tal

OFC questo non è perect :)

Problemi correlati