Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] Jak sprawdzic szybkosc i dostepnosc
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Dagger
Witam!
Chcial bym umiescic maly skrypt javascript w pliku index.html ktory by sprawdzal dostepnosc 2 innych moich kont www a nastepnie aby wybieral np. szybszy... tak aby strona otwierala sie by szybko osobie ja odwiedzajacej.
Jak to zrobic?
Pozdrawiam
Dagger
Bakus
W JS jest to niezbyt możliwe... jeżeli już, to w php wywołujesz polecenie PING i sprawdzasz jaki jest czas odpowiedzi poszczególnych maszyn, wybierasz tą dla której serwer odpowiedział szybciej i przekierowujesz...
Paul
Moim zdaniem nie ma tu JS sensu, poniewaz JS jest wykonywany po stronie przegladarki, a wiec jesli chcesz testowac dwa adresy to ta przegladarka i tak musi to pobrac...

Jesli jednak chcesz takie cos robic to ja widze to tak.. Poniewaz JS, z tego co wiem nie posiada funkcji do obslugi plikow (jedynie img da sie) mozna kombinowac pewne polrozwiazania... Np. ladowac do niewidocznych ramek podstrony poszczegolne i mierzyc czas, a nastepnie porownywac.. Prosza metoda moze za to byc ladowanie jakiegos obrazka, kilka razy dla usrednienia wynikow i porownywanie jego czasu ladowania z drugim obrazkiem...

Jednak wtedy wychodzi na to, ze i tak przegladarka ciagnie.... Dlatego lepszym rozwiazniem jest php smile.gif
Dagger
po 1. jak bede sprawdzal szybkosc pozostalych kont za pomoca php to czy ta predkosc nie bedzie sprawdzana pomiedzy serwerem z php a pozostalymi? Nie bedzie sprawdzana predkosc miedzy klientem a pozostalymi serwerami.
po 2. a czy za pomoca js da sie jedynie sprawdzic dostepnosc serwerow/plikow ? (bez sprawdzania szybkosci)
e-Gandalf
da sie i jedno i drugie zrobic z poziomu JS. Koledzy, ktorzy odpowiadali przede mna - czy testowalisice i probowaliscie to uzyskacz, czy twierdziecie ze sie nie da na "pale"?
Dagger ma oczywiscie racje, ze sprawdzajac dowolnym server-side sprawdzamy predkosc miedzy serwerem, a nie klientem.
W JS, mimo, ze nie ma natywnych mechanizmow do takich operacji (swoje specjalistyczne posiada Trident - silnik IE - w ActiveX, oraz Gecko - w postaci interfejsow sieciowych XPCOM) pozwala przy uzyciu sztuczek na takie manewry.

Rozwiazanie
1) Aby sprwdzic dostepnosc serwero nalezy umiescic na nich obrazek i z poziomu JS zazadac jego sciagania (x = new Image(), x.src="adres") nastepnie cyklicznie odpytywac czy obrazek juz zostal sciagniety - jesli nie zostanie np. przez 5 sekund uznajemy, ze serwer lezy. Jesli sciagna sie oba, ale jedenszybciej - masz prawdopodobna odpowiedz.

A teraz - co zrobic aby sprawdzic czy obrazek sie sciagnal? Kilka lat temu napisalem ATLoadera:

Kod
function AT_loader(o,O,t,h){

var p=[],A=0,S=0,i=[],r;

function d(i,W){p[p.length]=[i,W];A+=W;}

function y(){var g;

    S=0;for(g=0;g<p.length;g++)

  {

     if(!i[g]){i[g]=new Image();i[g].src=p[g][0]}

     else{(ie?i[g].complete:i[g].width>0)?S+=p[g][1]:0}

  }

eval(o);

if(S==A||(h-=t)<0){eval(O)}else{setTimeout(y,t)}

}

function s(){return [A,S]}

return {add:d,go:y,stat:s}

}


Zalatwia Ci wszystko co zwiazane ze sciaganiem obrazkow smile.gif
Dagger
A mogl bys opisac te zmienne wejsciowe (o,O,t,h) ?
e-Gandalf
mhm.

o - nazwa funkcji wywolywanej cyklicznie
O - nazwa funkcji wywolywanej na zakonczenie ladowania calej kolejki
t - co ile sprawdzac stan zaladowania
h- maksymalny czas oczekiwania

W Twoim wypadku tworzysz obiekt, dodajesz mu obrazek (metoda add ma dwa parametry - sciezka obrazka i jego ciezar)

Nastepnie odpalasz przez go() i sprawdzasz w pierwszej funkcji metode stat() - zwraca ona dwuelementowa tablice, ktorej pierwszy element okresla calkowity ciezar do sciagniecia, a S dotychczas sciagniety.

Zatem dla Ciebie jesli sciagnie sie jeden obrazek to S bedzie mialo wartosc ciezaru tego obrazka, jesli oba w jednym cyklu to S bedzie rowne ciezarowi obu obrazkow lacznie, a jesli zaden nie zostanie przez czas okreslony w h to wywolana zostanie funkcja O.

I na tej podstawie mozesz porownac szybkosc dzialania i sprawdzic czy stoja oba serwery.
Dagger
To chyba dla mnie za skomplikowane.
Osobiscie mam raczej dobre pomysly ale rozbijaja mi sie o sprawy techniczne :-(
e-Gandalf
Ehh... z palca:

Kod
var imgLoader;

var ready = false;



function start () {

  imgLoader = new AT_loader('step()','finish()',10,1000);

  imgLoader.add('http://www.onet.pl/obrazek.jpg',14326);

  imgLoader.add('http://www.wp.pl/obrazek2.jpg',14325); // wazna jest roznica

}



function step(){

  if (ready) return;

  var dwn = imgLoader.stat()[1];

  var sum = imgLoader.stat()[0];

  if (dwn == 14326) {

     alert('uwaga! szybciej sciagnal sie obrazek pierwszy');

     ready=true;

  } else if (dwn == 14325) {

     alert('uwaga! szybciej sciagnal sie obrazek drugi');

     ready=true;

  } else if (dwn == sum) {

     alert('uwaga! oba obrazki scaignely sie w tym samym takcie');

     ready=true;

  }

}

function finish() {

  var dwn = imgLoader.stat()[1];

  var sum = imgLoader.stat()[0];

  if (dwn !== sum) alert('oba serwery leza');

}
Dagger
Dzieki wieczorem bede to sprawdzal.
Paul
Cytat
da sie i jedno i drugie zrobic z poziomu JS. Koledzy, ktorzy odpowiadali przede mna - czy testowalisice i probowaliscie to uzyskacz, czy twierdziecie ze sie nie da na "pale"?

Czy ja powiedzialem, ze sie nie da angrysmiley.gif ?
Cytat
Prostsza metoda moze za to byc ladowanie jakiegos obrazka, kilka razy dla usrednienia wynikow i porownywanie jego czasu ladowania z drugim obrazkiem...  

Czyli chodzilo mi dokladnie o to, co napisales...
Cytat
Rozwiazanie
1) Aby sprwdzic dostepnosc serwero nalezy umiescic na nich obrazek i z poziomu JS zazadac jego sciagania (x = new Image(), x.src="adres")
e-Gandalf
A kto sugerowal php? ;p
Paul
podalem poprostu kilka rozwiazan...
e-Gandalf
i nadal sie upierasz, ze uzycie php zwroci to czego potrzebuje autor pytania?
Paul
Od poczatku sie nie upieralem, i sie nie upieram. EOT
Dagger
Wracajac do tematu...

W efekcie wyszedl mi taki skrypt:
Kod
<SCRIPT LANGUAGE="JavaScript">

var imgLoader;

var ready = false;





function AT_loader(o,O,t,h){

var p=[],A=0,S=0,i=[],r;

function d(i,W){p[p.length]=[i,W];A+=W;}

function y(){var g;

   S=0;for(g=0;g<p.length;g++)

      {

         if(!i[g]){i[g]=new Image();i[g].src=p[g][0]}

         else{(ie?i[g].complete:i[g].width>0)?S+=p[g][1]:0}

      }

eval(o);

if(S==A||(h-=t)<0){eval(O)}else{setTimeout(y,t)}

}

function s(){return [A,S]}

return {add:d,go:y,stat:s}

}

function finish() {

  var dwn = imgLoader.stat()[1];

  var sum = imgLoader.stat()[0];

  if (dwn !== sum) alert('oba serwery leza');

}

function step(){

  if (ready) return;

  var dwn = imgLoader.stat()[1];

  var sum = imgLoader.stat()[0];

  if (dwn == 14326) {

     alert('uwaga! szybciej sciagnal sie obrazek pierwszy');

     ready=true;

  } else if (dwn == 14325) {

     alert('uwaga! szybciej sciagnal sie obrazek drugi');

     ready=true;

  } else if (dwn == sum) {

     alert('uwaga! oba obrazki scaignely sie w tym samym takcie');

     ready=true;

  }

}

function start () {

  imgLoader = new AT_loader('step()','finish()',10,1000);

  imgLoader.add('http://www.coolpage.pl/1.jpg',14326);

  imgLoader.add('http://www.rip.boo.pl/1.jpg',14325); // wazna jest roznica

}





start()



</SCRIPT>


Jednak po uruchomieniu nic sie nie dzieje :-(
Gdzie popelnilem blad?
e-Gandalf
Wszystko zrobiles OK, tylko na koncu funkcji start() nalezy jeszcze odpalic ladowanie...

Kod
imgLoader.go();


Dodatkowo, zauwazylem - jesli nie uzywasz nigdzie zmiennej |ie| okreslajacej document.all lub false, to w bibliotece zamien "ie" na "document.all" - i dziala.

Pamietaj tez, zeby obrazki mialy taki rozmiar jak podajesz
Dagger
Fantastycznie ! Teraz dziala wszystko tak jak chcialem :-)
Dziekuje za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.