/** * 批量请求 * @param array $request_buffer_array ['ip:port'=>req_buf, 'ip:port'=>req_buf, ...] * @return multitype:unknown string */ function multiRequest($request_buffer_array) { \Statistics\Lib\Cache::$lastSuccessIpArray = array(); $client_array = $sock_to_ip = $ip_list = array(); foreach ($request_buffer_array as $address => $buffer) { list($ip, $port) = explode(':', $address); $ip_list[$ip] = $ip; $client = stream_socket_client("tcp://{$address}", $errno, $errmsg, 1); if (!$client) { continue; } $client_array[$address] = $client; stream_set_timeout($client_array[$address], 0, 100000); fwrite($client_array[$address], encode($buffer)); stream_set_blocking($client_array[$address], 0); $sock_to_address[(int) $client] = $address; } $read = $client_array; $write = $except = $read_buffer = array(); $time_start = microtime(true); $timeout = 0.99; // 轮询处理数据 while (count($read) > 0) { if (@stream_select($read, $write, $except, 0, 200000)) { foreach ($read as $socket) { $address = $sock_to_address[(int) $socket]; $buf = fread($socket, 8192); if (!$buf) { if (feof($socket)) { unset($client_array[$address]); } continue; } if (!isset($read_buffer[$address])) { $read_buffer[$address] = $buf; } else { $read_buffer[$address] .= $buf; } // 数据接收完毕 if (($len = strlen($read_buffer[$address])) && $read_buffer[$address][$len - 1] === "\n") { unset($client_array[$address]); } } } // 超时了 if (microtime(true) - $time_start > $timeout) { break; } $read = $client_array; } foreach ($read_buffer as $address => $buf) { list($ip, $port) = explode(':', $address); \Statistics\Lib\Cache::$lastSuccessIpArray[$ip] = $ip; } \Statistics\Lib\Cache::$lastFailedIpArray = array_diff($ip_list, \Statistics\Lib\Cache::$lastSuccessIpArray); ksort($read_buffer); return $read_buffer; }
/** * 批量请求 * @param array $request_buffer_array ['ip:port'=>req_buf, 'ip:port'=>req_buf, ...] * @return multitype:unknown string */ function multiRequest($request_buffer_array) { \Statistics\Lib\Cache::$lastSuccessIpArray = array(); $client_array = $sock_to_ip = $ip_list = array(); foreach ($request_buffer_array as $address => $buffer) { list($ip, $port) = explode(':', $address); $ip_list[$ip] = $ip; $client = new swoole_client(SWOOLE_TCP | SWOOLE_KEEP, SWOOLE_SOCK_SYNC); $client->connect($ip, $port); if (!$client) { continue; } $client_array[$address] = $client; $client_array[$address]->send(encode($buffer)); $sock_to_address[(int) $client->sock] = $address; } $read = $client_array; $write = $except = $read_buffer = array(); $time_start = microtime(true); $timeout = 0.99; // 轮询处理数据 while (count($read) > 0) { foreach ($read as $client) { $address = $sock_to_address[(int) $client->sock]; $buf = $client->recv(); if (!$buf) { unset($client_array[$address]); continue; } if (!isset($read_buffer[$address])) { $read_buffer[$address] = $buf; } else { $read_buffer[$address] .= $buf; } // 数据接收完毕 if (($len = strlen($read_buffer[$address])) && $read_buffer[$address][$len - 1] === "\n") { unset($client_array[$address]); } } // 超时了 if (microtime(true) - $time_start > $timeout) { break; } $read = $client_array; } foreach ($read_buffer as $address => $buf) { list($ip, $port) = explode(':', $address); \Statistics\Lib\Cache::$lastSuccessIpArray[$ip] = $ip; } \Statistics\Lib\Cache::$lastFailedIpArray = array_diff($ip_list, \Statistics\Lib\Cache::$lastSuccessIpArray); ksort($read_buffer); return $read_buffer; }
function admin() { $act = isset($_GET['act']) ? $_GET['act'] : 'home'; $err_msg = $notice_msg = $suc_msg = $ip_list_str = ''; $action = 'save_server_list'; switch ($act) { case 'detect_server': // 创建udp socket $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1); $buffer = json_encode(array('cmd' => 'REPORT_IP')) . "\n"; // 广播 socket_sendto($socket, $buffer, strlen($buffer), 0, '255.255.255.255', \Statistics\Config\Config::$ProviderPort); // 超时相关 $time_start = microtime(true); $global_timeout = 1; $ip_list = array(); $recv_timeout = array('sec' => 0, 'usec' => 8000); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $recv_timeout); // 循环读数据 while (microtime(true) - $time_start < $global_timeout) { $buf = $host = $port = ''; if (@socket_recvfrom($socket, $buf, 65535, 0, $host, $port)) { $ip_list[$host] = $host; } } // 过滤掉已经保存的ip $count = 0; foreach ($ip_list as $ip) { if (!isset(\Statistics\Lib\Cache::$ServerIpList[$ip])) { $ip_list_str .= $ip . "\r\n"; $count++; } } $action = 'add_to_server_list'; $notice_msg = "探测到{$count}个新数据源"; break; case 'add_to_server_list': if (empty($_POST['ip_list'])) { $err_msg = "保存的ip列表为空"; break; } $ip_list = explode("\n", $_POST['ip_list']); if ($ip_list) { foreach ($ip_list as $ip) { $ip = trim($ip); if (false !== ip2long($ip)) { \Statistics\Lib\Cache::$ServerIpList[$ip] = $ip; } } } $suc_msg = "添加成功"; foreach (\Statistics\Lib\Cache::$ServerIpList as $ip) { $ip_list_str .= $ip . "\r\n"; } saveServerIpListToCache(); break; case 'save_server_list': if (empty($_POST['ip_list'])) { $err_msg = "保存的ip列表为空"; break; } \Statistics\Lib\Cache::$ServerIpList = array(); $ip_list = explode("\n", $_POST['ip_list']); if ($ip_list) { foreach ($ip_list as $ip) { $ip = trim($ip); if (false !== ip2long($ip)) { \Statistics\Lib\Cache::$ServerIpList[$ip] = $ip; } } } $suc_msg = "保存成功"; foreach (\Statistics\Lib\Cache::$ServerIpList as $ip) { $ip_list_str .= $ip . "\r\n"; } saveServerIpListToCache(); break; default: foreach (\Statistics\Lib\Cache::$ServerIpList as $ip) { $ip_list_str .= $ip . "\r\n"; } } include ST_ROOT . '/Views/header.tpl.php'; include ST_ROOT . '/Views/admin.tpl.php'; include ST_ROOT . '/Views/footer.tpl.php'; }
<?php \Statistics\Lib\Cache::$ServerIpList = array('192.168.0.188' => '192.168.0.188');
<?php \Statistics\Lib\Cache::$ServerIpList = array('192.168.73.150' => '192.168.73.150');