Here's a solution for icmpv6 ping with php, dropping it here in case if someone has problems with icmpv6 with php.
<?php
$host = "2a03:2880:f11b:83:face:b00c:0:25de";
$timeout = 100000;
$count = 3;
echo "Latency: ". round(1000 * pingv6($host,$timeout,$count),5) ." ms \n";
function pingv6($target,$timeout,$count) {
echo "target is ipv6 address, ". getprotobyname('ipv6-icmp'). " \n";
$socket = socket_create(AF_INET6, SOCK_RAW, getprotobyname('ipv6-icmp'));
$sec=intval($timeout/1000);
$usec=$timeout%1000*1000;
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$sec, "usec"=>$usec));
$type = "\x80";
$seqNumber = chr(floor($i/256)%256) . chr($i%256);
$checksum= "\x00\x00";
$code = "\x00";
$identifier = chr(rand(0,255)) . chr(rand(0,255));
$msg = "!\"#$%&'()*+,-./1234567";
$package = $type.$code.$checksum.$identifier.$seqNumber.$msg;
$checksum = icmpChecksum($package);
$package = $type.$code.$checksum.$identifier.$seqNumber.$msg;
if(@socket_connect($socket, $target, null)){
for($i = 0; $i < $count; $i++){
list($start_usec, $start_sec) = explode(" ", microtime());
$start_time = ((float) $start_usec + (float) $start_sec);
$startTime = microtime(true);
socket_send($socket, $package, strLen($package), 0);
while ($startTime + $timeout*1000 > microtime(true)){
if(socket_read($socket, 255) !== false) {
list($end_usec, $end_sec) = explode(" ", microtime());
$end_time = ((float) $end_usec + (float) $end_sec);
$total_time = $end_time - $start_time;
echo "round trip time (".$i."): ". $total_time ."\n";
return $total_time;
break;
}else{
return "null";
echo "Timed out (".$i."), Got no echo reply\n";
break;
}
}
usleep($interval*1000);
}
socket_close($socket);
}
}
function icmpChecksum($data){
if (strlen($data)%2) $data .= "\x00";
$bit = unpack('n*', $data);
$sum = array_sum($bit);
while ($sum >> 16)
$sum = ($sum >> 16) + ($sum & 0xffff);
return pack('n*', ~$sum);
}
?>