Exemplo n.º 1
0
/**
 * 批量请求
 * @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;
}
Exemplo n.º 2
0
/**
 * 批量请求
 * @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;
}
Exemplo n.º 3
0
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';
}
Exemplo n.º 4
0
<?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');