Проверка функционирования хоста

Задача
Необходимо пропинговать хост, чтобы проверить, работает ли он, и можно ли получить к нему доступ.

Решение
Для этого примненяется пакет PEAR Net_Ping:

require 'Net/Ping.php';
$ping = new Net_Ping;
if ($ping->checkhost('www.oreilly.com')) {
print 'Reachable';
} else {
print 'Unreachable';
}
$data = $ping->ping('www.oreilly.com');

Обсуждение
Программа ping пытается отправить с вашей машины сообщение другому компьютеру. Если все идет хорошо, то вы получаете ряд данных, описывающих транзакцию. Ошибка означает, что программа ping по некоторым причинам не может добраться до хоста. В случае ошибки функция Net_Ping::checkhost() возвращает значение false, а функция Net_Ping::ping() возвращает константу PING_HOST_NOT_FOUND. Если появляется проблема при запуске программы ping (поскольку на самом деле Net_Ping – всего лишь оболочка этой программы), то возвращается PING_FAILED.

Если все в порядке, то вы получаете массив, как показано ниже:

$results = $ping->ping('www.oreilly.com');
foreach($results as $result) { print "$result\n"; }
PING www.oreilly.com (209.204.146.22) from 192.168.123.101 :
32(60) bytes of data.
40 bytes from www.oreilly.com (209.204.146.22): icmp_seq=0 ttl=239
time=96.704 msec
40 bytes from www.oreilly.com (209.204.146.22): icmp_seq=1 ttl=239
time=86.567 msec
40 bytes from www.oreilly.com (209.204.146.22): icmp_seq=2 ttl=239
time=86.563 msec
40 bytes from www.oreilly.com (209.204.146.22): icmp_seq=3 ttl=239
time=136.565 msec
40 bytes from www.oreilly.com (209.204.146.22): icmp_seq=4 ttl=239
time=86.627 msec
--- www.oreilly.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/mdev = 86.563/98.605/136.565/19.381 ms

Пакет Net_Ping не проводит какого-либо анализа данных, чтобы извлечь отдельные фрагменты информации, такие как доля потерянных пакетов или среднее время прохождения.


Но вы можете провести такой анализ самостоятельно:

$results = $ping->ping('www.oreilly.com');
// берем последнюю строку массива; эквивалентно неразрушающему
// методу array_pop() или $results[count($results) - 1]
$round_trip = end($results);
preg_match_all('#[ /]([.\d]+)#', $round_trip, $times);
// извлекаем данные
list($min,$avg,$max,$mdev) = $times[1];
// или печатаем
foreach($times[1] as $time) { print "$time\n"; }
83.229
91.230103.223
7.485

Это регулярное выражение ищет или символ пробела или символ косой черты. Затем оно выбирает последовательность из одного или более чисел и десятичной точки. Чтобы избежать преобразования в escape-последовательность символа /, мы выбираем в качестве разделителя нестандартный символ #..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Отправка почты
Отправка почты в кодировке MIME
Отправка сообщений в новостные группы Usenet
Поиск адресов с помощью LDAP
Поиск в DNS

Вернуться в раздел: PHP / 17. Интернет-службы