Home > php > PHP ping

PHP ping

January 30th, 2009

Σε ένα απο τα τελευταία projects που ασχολούμαι στην NetWerk, η εφαρμογή μου επικοινωνεί με web services που βρίσκονται σε άλλους servers, ωστόσο για την αποφυγή λαθών και για καλύτερο debugging ήθελα να κάνω ping τον server που “μιλάω” ωστε να ξέρω τι συμβαίνει.

Πώς κάνουμε ping με php

Επειδή γενικώς δέν μου αρέσει να ανακαλύπτω τον τροχό κάθε φορά που κάνω κάτι καινούριο, έψαξα στο internet και ανακάλυψα ένα code snippet για ping μέσω php. Το μόνο πρόβλημα, είναι πως εφόσον o server που κάνουμε ping δέν απαντήσει, το scriptάκι κολλάει. Παρακάτω είναι μία αλλαγμένη έκδοση του snippet οπου ορίζεις το timeout.


<?php

//add
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

// Checksum calculation function
function icmpChecksum($data) {
if (strlen($data)%2)
$data .= "\x00";

$bit = unpack('n*', $data);
$sum = array_sum($bit);

while ($sum >> 16)
$sum = ($sum >> 16) + ($sum &amp; 0xffff);

return pack('n*', ~$sum);
}

// Making the package
$type= "\x08";
$code= "\x00";
$checksum= "\x00\x00";
$identifier = "\x00\x00";
$seqNumber = "\x00\x00";
$data= "Scarface";
$package = $type.$code.$checksum.$identifier.$seqNumber.$data;
$checksum = icmpChecksum($package); // Calculate the checksum
$package = $type.$code.$checksum.$identifier.$seqNumber.$data;
// And off to the sockets
$socket = socket_create(AF_INET, SOCK_RAW, 1);
if (socket_connect($socket, $argv[1], null)) {

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0)); // thek add

// If you're using below PHP 5, see the manual for the microtime_float
// function. Instead of just using the m
//     icrotime() function.

//$startTime = microtime(true); // thek remove
$startTime = microtime_float(); // thek add

socket_send($socket, $package, strLen($package), 0);
if (socket_read($socket, 255)) {
//echo round(microtime(true) - $startTime, 4) .' seconds'; // thek remove
echo round(microtime_float() - $startTime, 4) .' seconds'; // thek add
}
else {
echo 'lost connection';
}
socket_close($socket);
}
else {
echo 'lost connection';
}
?>

Στο παραπάνω παράδειγμα το timeout θα γίνει σε 5 δευτερόλεπτα. Αν θέλετε να το αλλάξετε απλώς αλλάξτε το 5 στην παρακάτω γραμμή:

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array(“sec”=>5, “usec”=>0)); // thek add

Το script τρέχει μόνο απο CLI δίνοντας την εντολή

php -q script.php <ip address>

όπου script.php είναι το παρών σκριπτάκι και <ip_address> είναι η διεύθυνση που θέλετε να κάνετε ping. Σε επόμενο άρθρο θα γράψω πώς να το κάνετε απο web εφαρμογή.

php , ,

blog comments powered by Disqus