选择语言 :

 Core_HttpCall::exec_by_curl

通过CURL执行

array Core_HttpCall::exec_by_curl( array $hosts , string $url , string $path_info [, array $param_arr = null ] )

参数列表

参数 类型 描述 默认值
$hosts array 请求的所有服务器列表
$url string 请求的URL
$path_info string 待请求的 path_info 参数
$param_arr array 请求的参数 null
返回值
  • array
File: ./core/classes/httpcall.class.php
protected static function exec_by_curl($hosts, $url, $path_info, array $param_arr = null)
{
    $mh = curl_multi_init();

    # 监听列表
    $listener_list = array();

    $vars = http_build_query($param_arr);

    # 创建列队
    foreach ($hosts as $h)
    {
        # 排除重复HOST
        if (isset($listener_list[$h]))continue;

        list($host,$port) = explode(':',$h,2);
        if (!$port)
        {
            # 默认端口
            $port = $_SERVER["SERVER_PORT"];
        }

        # 一个mictime
        $mictime = microtime(1);

        # 生成一个随机字符串
        $rstr = Text::random();

        # 创建一个curl对象
        $current = HttpCall::_create_curl($host, $port, $url, $path_info, 10, $vars, $mictime, $rstr);

        # 列队数控制
        curl_multi_add_handle($mh, $current);

        $listener_list[$h] = $current;
    }
    unset($current);

    $running = null;

    $result = array();

    # 已完成数
    $done_num = 0;

    # 待处理数
    $list_num = count($listener_list);

    do
    {
        while (($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
        if ($execrun!=CURLM_OK)break;

        while (true==($done = curl_multi_info_read($mh)))
        {
            foreach ($listener_list as $done_host=>$listener)
            {
                if ($listener === $done['handle'])
                {
                    # 获取内容
                    $result[$done_host] = curl_multi_getcontent($done['handle']);

                    $code = curl_getinfo($done['handle'], CURLINFO_HTTP_CODE);

                    if ( $code!=200 )
                    {
                        Core::debug()->error('system exec:'.$done_host.' ERROR,CODE:' . $code );
                           $result[$done_host] = false;
                    }
                    else
                    {
                        # 返回内容
                        Core::debug()->info('system exec:'.$done_host.' OK.');
                    }

                    curl_close($done['handle']);

                    curl_multi_remove_handle($mh, $done['handle']);

                    unset($listener_list[$done_host], $listener);

                    $done_num++;

                    $time = microtime(1);

                    break;
                }
            }

        }

        if ($done_num>=$list_num) break;

        if (!$running) break;

    } while (true);


    # 关闭列队
    curl_multi_close($mh);

    return $result;
}