Recipe 16.10. Checking if a Host Is Alive


16.10.1. Problem

You want to ping a host to see if it is still up and accessible from your location.

16.10.2. Solution

Use PEAR's Net_Ping package:

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');

16.10.3. Discussion

The ping program tries to send a message from your machine to another. If everything goes well, you get a series of statistics chronicling the transaction. An error means that ping can't reach the host for some reason.

On error, Net_Ping::checkhost( ) returns false, and Net_Ping::ping( ) returns the constant PING_HOST_NOT_FOUND. If there's a problem running the ping program (because Net_Ping is really just a wrapper for the program), PING_FAILED is returned.

If everything is okay, you receive an array similar to this:

$results = $ping->ping('www.oreilly.com'); foreach($results as $result) { print "$result\n"; } $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 doesn't do any parsing of the data to pull apart the information, such as the packet loss percentage or the average round-trip time. However, you can parse it yourself:

$results = $ping->ping('www.oreilly.com'); // grab last line of array; equivalent to non-destructive array_pop() // or $results[count($results) - 1] $round_trip = end($results); preg_match_all('#[ /]([.\d]+)#', $round_trip, $times); // pull out the data list($min,$avg,$max,$mdev) = $times[1]; // or print it out foreach($times[1] as $time) { print "$time\n"; } $results = $ping->ping('www.oreilly.com'); // grab last line of array; equivalent to non-destructive array_pop() // or $results[count($results) - 1] $round_trip = end($results); preg_match_all('#[ /]([.\d]+)#', $round_trip, $times); // pull out the data list($min,$avg,$max,$mdev) = $times[1]; // or print it out foreach($times[1] as $time) { print "$time\n"; } 83.229 91.230 103.223 7.485

This regular expression searches for either a space or a slash. It then captures a sequence of one or more numbers and a decimal point. To avoid escaping /, we use the # nonstandard character as your delimiter.

16.10.4. See Also

PEAR's Net_Ping package at http://pear.php.net/package-info.php?package=Net_Ping.




PHP Cookbook, 2nd Edition
PHP Cookbook: Solutions and Examples for PHP Programmers
ISBN: 0596101015
EAN: 2147483647
Year: 2006
Pages: 445

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net