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

?>