ping.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 1,099 行 · 第 1/3 页
SVN-BASE
1,099 行
* @return bool True on success or false otherwise * */ function checkHost($host, $severely = true) { $matches = array(); $this->setArgs(array("count" => 10, "size" => 32, "quiet" => null, "deadline" => 10 ) ); $res = $this->ping($host); if (PEAR::isError($res)) { return false; } if (!preg_match_all('|\d+|', $res[3], $matches) || count($matches[0]) < 3) { ob_start(); $rep = ob_get_contents(); ob_end_clean(); trigger_error("Output format seems not to be supported, please report ". "the following to pear-dev@lists.php.net, including your ". "version of ping:\n $rep"); return false; } if ($matches[0][1] == 0) { return false; } // [0] => transmitted, [1] => received if ($matches[0][0] != $matches[0][1] && $severely) { return false; } return true; } /* function checkHost() */ /** * Output errors with PHP trigger_error(). You can silence the errors * with prefixing a "@" sign to the function call: @Net_Ping::ping(..); * * @param mixed $error a PEAR error or a string with the error message * @return bool false * @access private * @author Kai Schr鰀er <k.schroeder@php.net> */ function _raiseError($error) { if (PEAR::isError($error)) { $error = $error->getMessage(); } trigger_error($error, E_USER_WARNING); return false; } /* function _raiseError() */ /** * Creates the argument list according to platform differences * * @return string Argument line * @access private */ function _initArgRelation() { $this->_argRelation["sunos"] = array( "timeout" => NULL, "ttl" => "-t", "count" => " ", "quiet" => "-q", "size" => " ", "iface" => "-i" ); $this->_argRelation["freebsd"] = array ( "timeout" => "-t", "ttl" => "-m", "count" => "-c", "quiet" => "-q", "size" => NULL, "iface" => NULL ); $this->_argRelation["netbsd"] = array ( "timeout" => "-w", "iface" => "-I", "ttl" => "-T", "count" => "-c", "quiet" => "-q", "size" => "-s" ); $this->_argRelation["openbsd"] = array ( "timeout" => "-w", "iface" => "-I", "ttl" => "-t", "count" => "-c", "quiet" => "-q", "size" => "-s" ); $this->_argRelation["darwin"] = array ( "timeout" => "-t", "iface" => NULL, "ttl" => NULL, "count" => "-c", "quiet" => "-q", "size" => NULL ); $this->_argRelation["linux"] = array ( "timeout" => "-t", "iface" => NULL, "ttl" => "-m", "count" => "-c", "quiet" => "-q", "size" => "-s", "deadline" => "-w" ); $this->_argRelation["debian"] = array ( "timeout" => "-t", "iface" => NULL, "ttl" => "-m", "count" => "-c", "quiet" => "-q", "size" => "-s", ); $this->_argRelation["windows"] = array ( "timeout" => "-w", "iface" => NULL, "ttl" => "-i", "count" => "-n", "quiet" => NULL, "size" => "-l" ); $this->_argRelation["hpux"] = array ( "timeout" => NULL, "iface" => NULL, "ttl" => "-t", "count" => "-n", "quiet" => NULL, "size" => " " ); $this->_argRelation["aix"] = array ( "timeout" => "-i", "iface" => NULL, "ttl" => "-T", "count" => "-c", "quiet" => NULL, "size" => "-s" ); } /* function _initArgRelation() */} /* class Net_Ping *//*** Container class for Net_Ping results** @author Jan Lehnardt <jan@php.net>* @version $Revision$* @package Net* @access private*/class Net_Ping_Result{ /** * ICMP sequence number and associated time in ms * * @var array * @access private */ var $_icmp_sequence = array(); /* array($sequence_number => $time ) */ /** * The target's IP Address * * @var string * @access private */ var $_target_ip; /** * Number of bytes that are sent with each ICMP request * * @var int * @access private */ var $_bytes_per_request; /** * The total number of bytes that are sent with all ICMP requests * * @var int * @access private */ var $_bytes_total; /** * The ICMP request's TTL * * @var int * @access private */ var $_ttl; /** * The raw Net_Ping::result * * @var array * @access private */ var $_raw_data = array(); /** * The Net_Ping::_sysname * * @var int * @access private */ var $_sysname; /** * Statistical information about the ping * * @var int * @access private */ var $_round_trip = array(); /* array('min' => xxx, 'avg' => yyy, 'max' => zzz) */ /** * Constructor for the Class * * @access private */ function Net_Ping_Result($result, $sysname) { $this->_raw_data = $result; $this->_sysname = $sysname; $this->_parseResult(); } /* function Net_Ping_Result() */ /** * Factory for Net_Ping_Result * * @access public * @param array $result Net_Ping result * @param string $sysname OS_Guess::sysname */ function factory($result, $sysname) { if (!Net_Ping_Result::_prepareParseResult($sysname)) { return PEAR::throwError(NET_PING_RESULT_UNSUPPORTED_BACKEND_MSG, NET_PING_RESULT_UNSUPPORTED_BACKEND); } else { return new Net_Ping_Result($result, $sysname); } } /* function factory() */ /** * Preparation method for _parseResult * * @access private * @param string $sysname OS_Guess::sysname * $return bool */ function _prepareParseResult($sysname) { $parse_methods = array_values(get_class_methods('Net_Ping_Result')); return in_array('_parseresult'.$sysname, $parse_methods); } /* function _prepareParseResult() */ /** * Delegates the parsing routine according to $this->_sysname * * @access private */ function _parseResult() { call_user_func(array(&$this, '_parseResult'.$this->_sysname)); } /* function _parseResult() */ /** * Parses the output of Linux' ping command * * @access private * @see _parseResultlinux */ function _parseResultlinux() { $raw_data_len = count($this->_raw_data); $icmp_seq_count = $raw_data_len - 4; /* loop from second elment to the fifths last */ for($idx = 1; $idx < $icmp_seq_count; $idx++) { $parts = explode(' ', $this->_raw_data[$idx]); $this->_icmp_sequence[substr(@$parts[4], 9, strlen(@$parts[4]))] = substr(@$parts[6], 5, strlen(@$parts[6])); } $this->_bytes_per_request = $parts[0]; $this->_bytes_total = (int)$parts[0] * $icmp_seq_count; $this->_target_ip = substr($parts[3], 0, -1); $this->_ttl = substr($parts[5], 4, strlen($parts[3])); $stats = explode(',', $this->_raw_data[$raw_data_len - 2]); $transmitted = explode(' ', $stats[0]); $this->_transmitted = $transmitted[0]; $received = explode(' ', $stats[1]); $this->_received = $received[1]; $loss = explode(' ', $stats[2]); $this->_loss = (int)$loss[1]; $round_trip = explode('/', str_replace('=', '/', substr($this->_raw_data[$raw_data_len - 1], 0, -3))); /* if mdev field exists, shift input one unit left */ if (strpos($this->_raw_data[$raw_data_len - 1], 'mdev')) { /* do not forget the rtt field */ $this->_round_trip['min'] = ltrim($round_trip[5]); $this->_round_trip['avg'] = $round_trip[6]; $this->_round_trip['max'] = $round_trip[7]; } else { $this->_round_trip['min'] = ltrim($round_trip[4]); $this->_round_trip['avg'] = $round_trip[5]; $this->_round_trip['max'] = $round_trip[6]; } } /* function _parseResultlinux() */ /** * Parses the output of NetBSD's ping command * * @access private * @see _parseResultfreebsd */ function _parseResultnetbsd() { $this->_parseResultfreebsd(); } /* function _parseResultnetbsd() */ /** * Parses the output of Darwin's ping command * * @access private */ function _parseResultdarwin() { $raw_data_len = count($this->_raw_data); $icmp_seq_count = $raw_data_len - 5; /* loop from second elment to the fifths last */ for($idx = 1; $idx < $icmp_seq_count; $idx++) { $parts = explode(' ', $this->_raw_data[$idx]); $this->_icmp_sequence[substr($parts[4], 9, strlen($parts[4]))] = substr($parts[6], 5, strlen($parts[6])); } $this->_bytes_per_request = (int)$parts[0]; $this->_bytes_total = (int)($this->_bytes_per_request * $icmp_seq_count); $this->_target_ip = substr($parts[3], 0, -1); $this->_ttl = (int)substr($parts[5], 4, strlen($parts[3])); $stats = explode(',', $this->_raw_data[$raw_data_len - 2]); $transmitted = explode(' ', $stats[0]); $this->_transmitted = (int)$transmitted[0]; $received = explode(' ', $stats[1]); $this->_received = (int)$received[1];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?