download this file: class.socket.tcpping.php view text/plain: class.socket.tcpping.php file encoding: UTF-8 [goback]
<?php
##
## this file name is 'class.socket.tcpping.php'
##
## socket http object
##
## [author]
## - san2(at)linuxchannel.net
##
## [changes]
## - 2016.05.23 : add error_print()
## - 2015.12.28 : add iport opitons
## - 2015.12.23 : new build
##
## [references]
## - http://ftp.linuxchannel.net/devel/php_socket_tcpping/
##
## [usage]
##
## [example]
##
@error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
class tcpping
{
## loading server latency
## default non-blocking mode
##
public function &ping($iporhost='', $connect_timeout=4, $connect_retry=1, $port=NULL)
{
static $_bsize = 1024; // socket send/receive buffer size(Bytes)
static $_timeout = array('sec'=>0,'usec'=>500000);
static $_port = 7;
if(!$sock = @socket_create(AF_INET,SOCK_STREAM,SOL_TCP))
{
return array(-1,socket_last_error());
}
//@socket_set_option($sock,SOL_TCP,TCP_NODELAY,1); // Nagle algorithm off
@socket_set_option($sock,SOL_SOCKET,SO_REUSEADDR,1);
@socket_set_option($sock,SOL_SOCKET,SO_KEEPALIVE,1);
@socket_set_option($sock,SOL_SOCKET,SO_SNDBUF,$_bsize);
@socket_set_option($sock,SOL_SOCKET,SO_RCVBUF,$_bsize);
@socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,$_timeout); // good idea for blocking mode
@socket_set_option($sock,SOL_SOCKET,SO_SNDTIMEO,$_timeout);
@socket_set_option($sock,SOL_SOCKET,SO_LINGER,array('l_onoff'=>1,'l_linger'=>0));
@socket_set_nonblock($sock); // set to non-blocking mode
$connect_timeout = (int)$connect_timeout;
$connect_retry = (int)$connect_retry;
$connect_retry = $connect_retry ? $connect_retry : 1;
list($iporhost,$iport) = explode(':',$iporhost);
$ip = preg_match('/[a-z]/i',$iporhost) ? gethostbyname($iporhost) : $iporhost;
if($iport != '') $port = $iport; // internal port
else $port = $port ? $port : $_port;
$_cs = microtime();
for($i=0; $i<$connect_retry; $i++)
{
list($code,$msg) = tcpping::_connect($sock,$ip,$port,$connect_timeout);
if($code == 1) { $_ce = microtime(); break; } // ok
}
@socket_close($sock);
if($code != 1)
{
return array(-1,$msg,"$ip:$port");
}
return array(tcpping::getms($_cs,$_ce),'alived',"$ip:$port"); // connect time
}
## connect to host:port
##
## [return]
## 1 or TRUE : connected
## 0 or FALSE : can't connect, client issue
## -1 : connetion time out, remote issue
##
private function &_connect(&$sock, $host, $port, $timeout=5)
{
$_time = time();
while(1)
{
if((time()-$_time) >= $timeout) { return array(-1,'Connect timeout='.$timeout); break; }
@socket_connect($sock,$host,$port);
$errno = @socket_last_error();
//echo "DEBUG: $errno ".socket_strerror($errno)."\n";
if($errno==114 || $errno==115) continue; // in progress
else if($errno==106 || $errno==111) { return array(TRUE,'OK'); break; } // OK, Connection refused
else if($errno < 0) { return array(FALSE,socket_strerror($errno)); break; } // unknown host
else if($errno==100 || $errno==101 || $errno==102) { return array(FALSE,socket_strerror($errno)); break; } // Network fail
else if($errno==110) { return array(-1,socket_strerror($errno)); break; } // Connection timed out
else if($errno==112 || $errno==113) { return array(-1,socket_strerror($errno)); break; } // Host is down, No route to host
}
return array(FALSE,'');
}
private function &getms($_start, $_end=NULL)
{
if(!$_start) return -1; // patch san2@2015.08.13
$end = explode(' ', $_end?$_end:microtime());
$start = explode(' ', $_start);
return sprintf('%.3f',(($end[1]+$end[0])-($start[1]+$start[0])) * 1000);
}
public function &error($errstr)
{
return error_log($errstr,0);
}
public function &error_print($errstr)
{
return fwrite(STDERR,rtrim($errstr)."\n");
}
} // end of class
?>