Jak korzystając ze skryptu wysłać pinga
Adam Boduch
Pod systemami typu Unix scieżka /bin/ping
.
Program'ów można wywołać zwyczajnie korzystając z shella (powłoki) - 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:
<?php
$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];
Niestety w PHP nie da się po prostu stworzyć procesu z parametrami ["-c", 5, "www.4programmers.net"]
, da się jedynie "imitować" wywołanie powłoki, przez co łatwiej popełnić błąd z formatowaniem - użycie znaków /
, \
, "
, '
, :
, ;
zależnie od systemu operacyjnego.