Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Fping - czyli pinogowanie z php, pingowanie serwera proxy
fiasko
post 5.12.2010, 15:47:55
Post #1





Grupa: Zarejestrowani
Postów: 243
Pomógł: 1
Dołączył: 1.06.2010

Ostrzeżenie: (0%)
-----


Skrypt ma odpytywać poleceniem ping w protokole icmp co jakiś czas serwery proxy i musi działać szybko - max time to live 100ms - reszta serwerów mnie nie interesuje.
mam taki kod :

  1. $odpowiedz = exec("ping -c 1 -i 0.1 ".$host."");
  2. echo $odpowiedz ;


Niestety ale w przypadku gdy host długo nie odpowiada trzeba też długo czekać. W shelu natomiast skrypt działa poprawnie i opcja i skraca czas oczekiwania.

Wtedy na serwer kolega wrzucił mi fping.

Zmieniłem kod na


  1. $odpowiedz = exec("/usr/sbin/fping -c 1 -i 100 213.180.146.27"); // platforma linux
  2. echo $odpowiedz ;


To nie działa w ogóle mimo, iż w shelu śmiga bez problemu.

Od razu dodam, że Curl, fsockopen, socket_create odpada.
Go to the top of the page
+Quote Post
modern-web
post 5.12.2010, 16:42:14
Post #2





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

Ostrzeżenie: (0%)
-----


Nie działa, bo pewnie polecenie exec() jak i system() są zablokowane przez administrację hostingu (bo jak się domyślam pliki te nie działają Ci na serwerze w sieci).


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
fiasko
post 5.12.2010, 17:12:23
Post #3





Grupa: Zarejestrowani
Postów: 243
Pomógł: 1
Dołączył: 1.06.2010

Ostrzeżenie: (0%)
-----


Serwer to ja mam dedykowany.

ok . udało mi się.

Muszę jeszcze za pomocą preg_match_all wyłuskać ten czas ze zmiennej $odpowiedz. Nie wiem czemu ale jak mierzę czas w microtime() to jest 507 ms podczas gdy sam ping odpowiada w 37 ms - takie dane są w zmiennej odpowiedź w stringu , który zwraca.


Znowu jak zmieniam wywołanie z fping na ping to czas mierzy się poprawnie obydwoma metodami. - różnice nie są już tak duże - rzędu 0.1 ms.


Do mierzenia używam :

list($usec, $sec) = explode(" ",microtime());
$getmicrotime = ((float)$usec + (float)$sec);

$start = $getmicrotime;

list($usec, $sec) = explode(" ",microtime());
$getmicrotime2 = ((float)$usec + (float)$sec);
$stop = $getmicrotime;

potem tylko wystarczy odjąć czas $stop - $start i wynik gotowy.

Przeliczam to potem jeszcze na ms.

Ciekawi mnie skąd jest taka różnica w odchyleniach czasowych.


Dobra skończyłem pisać.

  1. function ping($host , $obr)
  2. {
  3.  
  4.  
  5.  
  6. for ( $ob = 0; $ob < $obr; $ob ++ )
  7. {
  8.  
  9. $str=exec("/usr/sbin/fping -c 1 -i 100 ".$host);
  10. //$odpowiedz .= 'STR to '.$str.'<br><br>';
  11. $kod = '/[0-9\.]{1,5}\s{1}ms/';
  12. preg_match_all($kod, $str, $rezultat);
  13.  
  14. if(strlen($str)>1){
  15. $il = strlen($rezultat[0][0]);
  16. $czas = substr($rezultat[0][0],0,$li - 3);
  17.  
  18. $odpowiedz .= 'Odpowiedź w czasie '.$czas.' ms dla adresu '.$host.'<br>';
  19.  
  20. }
  21.  
  22. else
  23. {
  24. $odpowiedz .= "Upłynął limit czasu żądania dla adresu ".$host."<br>'";
  25. }
  26.  
  27. }
  28.  
  29. return ($odpowiedz);
  30. }
  31. $ping = ping($host , 1); // Pod zmienną host wpisujemy IP serwera. Druga to ilość odpytywań
  32.  
  33. echo $ping;
  34.  



Skryptem tym można w miarę szybko odpytać kilkadziesiąt serwerów.

Ja np. odpytuję serwery, które mam w bazie danych i nadaje im statusy aktywny - nie aktywny.

Dzięki temu inne funkcje , które korzystają z serwera np. proxy mogą raz dwa dogadać się z serwerem.

Dla mnie to tylko pierwszy etap sprawdzania czy dany serwer jest aktywny.

Następnym etapem jest sprawdzenie czy serwer świadczy usługę proxy na porcie, który mam zapisany w bazie. Ja używam do tego Curl.


Ten post edytował fiasko 5.12.2010, 18:06:49
Go to the top of the page
+Quote Post
1oBuZ
post 5.12.2010, 20:40:36
Post #4





Grupa: Zarejestrowani
Postów: 101
Pomógł: 1
Dołączył: 11.11.2008
Skąd: Kalisz

Ostrzeżenie: (10%)
X----


Proszę, gotowiec od mnie:

  1. function ping($ip){
  2.  
  3. $ping = exec("/bin/ping -c 1 $ip");
  4. preg_match("/rtt min\/avg\/max\/mdev = (.*)\/(.*)\/(.*)\/(.*) ms/", $ping, $matches);
  5. $ping=$matches[2];
  6.  
  7. return $ping;
  8.  
  9. }


Ten post edytował 1oBuZ 5.12.2010, 20:41:08


--------------------
W poszukiwaniu rozwiązania problemu, najbardziej pomocna jest znajomość odpowiedzi.

Dla komputera nie ma rzeczy niemożliwych z wyjątkiem tych, których od niego wymagamy.

Liczba osób w zespole programistycznym ma tendencje wzrastające, niezależnie od ilości pracy.
Go to the top of the page
+Quote Post
fiasko
post 6.12.2010, 00:34:57
Post #5





Grupa: Zarejestrowani
Postów: 243
Pomógł: 1
Dołączył: 1.06.2010

Ostrzeżenie: (0%)
-----


Tak tylko dodaj u siebie time to live. Bo w innym wypadku zobaczysz w jakim czasie uzyskasz tablicę wyników . Z tego co tam masz w kodzie to ping będzie czekał całą sekundę w przypadku nieobecności komputera w sieci. Przy 1000 komputerach to już tysiąc sekund. U mnie trwa to 100 sekund.

Teraz zabieram się za automatyczne wyszukiwanie serwerów proxy.

Muszę napisać robota, który zindeksuje mi do bazy danych adresy ip + ich porty. Do tego znowu użyję curl i cron.

Jak znacie jakieś dobre serwisy z listą serwerów proxy to dajcie mi namiar. będę miał na czym testować.


Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.05.2025 - 07:47