Programowanie w języku PHP » FAQ

Jak korzystając ze skryptu wysłać pinga

Pod systemami typu Unix scieżka /bin/ping.

Program ów można wywołać zwyczajnie korzystając z shella - jego użycie wygląda następująco:

Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
            [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
            [-M mtu discovery hint] [-S sndbuf]
            [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination



Nas właściwie interesują najbardziej parametry -c (ilość wysłanych pakietów) oraz -i  (odstęp pomiędzy kolejnym wysłaniem).

Np. wpisanie w terminalu takiej komendy:

ping -c 5 -i 1 www.4programmers.net

Spowoduje wysłanie 5 pingów w odstępach 1 sekundowych. Oto rezultat działania programu:

PING 4programmers.net (217.11.134.154) from 192.168.64.59 : 56(84) bytes of data.
64 bytes from spike.esolution.pl (217.11.134.154): icmp_seq=1 ttl=54 time=52.1 ms
64 bytes from spike.esolution.pl (217.11.134.154): icmp_seq=2 ttl=54 time=38.2 ms
64 bytes from spike.esolution.pl (217.11.134.154): icmp_seq=3 ttl=54 time=58.9 ms
64 bytes from spike.esolution.pl (217.11.134.154): icmp_seq=4 ttl=54 time=43.2 ms
64 bytes from spike.esolution.pl (217.11.134.154): icmp_seq=5 ttl=54 time=85.5 ms

--- 4programmers.net ping statistics ---


Teraz, aby wysłać pakiet ping ze skryptu PHP, należy użyć funkji
exec()
.

Oto przykład:

$ping = exec("/bin/ping -c 5 www.4programmers.net");


W takim wypadku wysłanych zostanie 5 pingów, a zawartość zmiennej $ping będzie wyglądała następująco:

rtt min/avg/max/mdev = 14.709/31.739/64.134/17.670 ms


Nas interesuje, aby z tego ciagu "wydobyć" średni czas odpowiedzi z serwera. Realizuje to poniższy skrypt:

<?
   $ping = exec("/bin/ping -c 5 www.4programmers.net");
 
   preg_match("/rtt min\/avg\/max\/mdev = (.*)\/(.*)\/(.*)\/(.*) ms/", $ping, $matches);
 
   echo 'Średni czas odpowiedzi: ' . $matches[2];
 
?>