2013-04-28 7 views
6

Voglio raccogliere alcune informazioni usando i visitatori dei miei siti web.
Quello che mi serve è che ogni visitatore esegua il ping di 3 nomi host diversi e quindi salva le seguenti informazioni in un DB.Come testare la latenza da utente a server nel browser usando javascript?

Visitor IP, latency 1,latency 2, latency 3 

Ovviamente tutto deve essere trasparente per il visitatore senza interromperlo in alcun modo. È possibile? Puoi darmi un esempio? Ci sono tutti i plugin per jQuery o qualcosa per rendere più facile

EDIT

Questo è quello che ho finora jsfiddle.net/dLVG6 ma i dati sono troppo casuale. Si salta 50-190

risposta

2

Con jQuery si potrebbe: $.ajax(url,settings) (http://api.jquery.com/jQuery.ajax/) e prendere il tempo da beforeSend e complete via Date.now(), sottrarre quei tempi -> allora si ha il tempo per la richiesta (non esattamente centrale del " Ping "però)

+0

Solo una nota che questo approccio incontrerà ulteriore latenza se è richiesta una ricerca DNS (non è sicuro se la domanda dovrebbe includere il tempo di ricerca DNS come parte della latenza, se applicabile). – kendaleiv

+0

L'ho provato ma i dati sono troppo casuali. Ho aggiunto una demo che puoi effettuare il checkout – Jim

+0

Il tuo fiddle finisce con il caching del file js, dovresti fare qualcosa del genere per evitare il caching: http://jsfiddle.net/dLVG6/1/ – olsn

6

Questo sarà più un dolore che si potrebbe pensare.

Il tuo primo problema è che Javascript non ha ping. Principalmente ciò che Javascript è buono è HTTP e alcuni protocolli di cugino.

Il secondo problema è che non è possibile emettere alcune richieste di ajax e cronometrare i risultati (sarebbe troppo ovvio). Lo same origin policy ti impedirà di usare ajax per parlare con server diversi da quello da cui proviene la pagina. Avrai bisogno di usare JSONP, o cambiare l'src di un tag immagine, o qualcos'altro più indiretto.

Il terzo problema è che non si desidera eseguire operazioni che comportino la restituzione di molti dati. Non si desidera che il tempo di trasferimento dei dati o l'elaborazione estesa del server interferiscano con la misurazione della latenza.

In quarto luogo, non è possibile chiedere URL che potrebbero essere memorizzati nella cache. Se l'oggetto si trovasse nella cache, otterresti misurazioni di "latenza" molto basse, ma non sarebbe significativo.

La mia soluzione era utilizzare un tag immagine senza attributo src. Al caricamento del documento, impostare src in modo che punti a un server valido ma utilizzare una porta non valida. In genere, è più veloce per un server rifiutare semplicemente la connessione piuttosto che generare una risposta di errore 404 corretta. Tutto quello che devi fare è misurare quanto tempo ci vuole per ottenere l'evento di errore dall'immagine.

Da The Filddle:

var start = new Date().getTime(); 
$('#junkOne').attr('src', 'http://fate.holmes-cj.com:8886/').error(function() { 
    var end = new Date().getTime(); 
    $('#timer').html("" + (end - start) + "ms"); 
}); 

La tecnica potrebbe probabilmente essere migliorato. Ecco alcune idee:

  1. Utilizzare l'indirizzo IP anziché il nome host DNS.
  2. Fare il "ping" più volte, eliminare i punteggi più alti e più bassi, quindi calcolare la media del resto.
  3. Se la tua pagina web ha un'elaborazione molto pesante, prova a fare i test quando pensi che il caricamento dell'interfaccia utente sia più leggero.
+0

Bello, ma non sono sicuro di poterlo utilizzare. Richiedere contenuti HTML non è un caso migliore. Questo è quello che ho finora http://jsfiddle.net/dLVG6/ ma i dati sono troppo casuali. Salta da 50 a 190 – Jim

+0

Non capisci. L'intero punto è di interrogare una porta che rifiuterà la tua connessione. Non è richiesto contenuto HTML. In realtà, non vuoi affatto alcun contenuto. – slashingweapon

+0

Il tuo codice richiede un elemento chiamato junkOne. Speravo di lavorare senza di esso – Jim

Problemi correlati