通过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
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;
}