文档章节

PHP用curl_multi并行获取多个HTTP接口数据

eechen
 eechen
发布于 2016/09/10 19:13
字数 476
阅读 696
收藏 4

接口1: php -S 127.0.0.1:8080 -t /home/eechen/www
接口2: php -S 127.0.0.2:8080 -t /home/eechen/www
/home/eechen/www/index.php:

<?php
header('Content-Type: application/json; charset=utf-8');
echo json_encode(array('SERVER_NAME' => $_SERVER['SERVER_NAME']));
//串行访问需要sum(2,1)秒,并行访问需要max(2,1)秒.
($_SERVER['SERVER_NAME'] == '127.0.0.1') ? sleep(2) : sleep(1);

串行和并行对比:

串行:
<?php
$ch1 = curl_init();
$ch2 = curl_init();
curl_setopt($ch1, CURLOPT_URL, 'http://127.0.0.1:8080/');
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_URL, 'http://127.0.0.2:8080/');
curl_setopt($ch2, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
$starttime = microtime(true);
$json[] = curl_exec($ch1);
$json[] = curl_exec($ch2);
echo microtime(true) - $starttime."\n"; //耗时约3秒
curl_close($ch1);
curl_close($ch2);
var_export($json);
//输出:
3.002946138382
array (
  0 => '{"SERVER_NAME":"127.0.0.1"}',
  1 => '{"SERVER_NAME":"127.0.0.2"}',
)

并行:
<?php
$url[] = 'http://127.0.0.1:8080';
$url[] = 'http://127.0.0.2:8080';
$mh = curl_multi_init();
foreach($url as $k => $v) {
	$ch[$k] = curl_init($v);
	curl_setopt($ch[$k], CURLOPT_HEADER, 0); //不输出头
	curl_setopt($ch[$k], CURLOPT_RETURNTRANSFER, 1); //exec返回结果而不是输出,用于赋值
	curl_multi_add_handle($mh, $ch[$k]); //决定exec输出顺序
}
$running = null;
$starttime = microtime(true);
//执行批处理句柄(类似pthreads多线程里的start开始和join同步)
do {
	//CURLOPT_RETURNTRANSFER如果为0,这里会直接输出获取到的内容.如果为1,后面可以用curl_multi_getcontent获取内容.
	curl_multi_exec($mh, $running);
	//阻塞直到cURL批处理连接中有活动连接,不加这个会导致CPU负载超过90%.
	curl_multi_select($mh);
} while ($running > 0);
echo microtime(true) - $starttime."\n"; //耗时约2秒
foreach($ch as $v) {
	$info[] = curl_getinfo($v);
	$json[] = curl_multi_getcontent($v);
	curl_multi_remove_handle($mh, $v);
}
curl_multi_close($mh);
var_export($json); 
var_export($info);
//输出:
2.0015449523926
array (
  0 => '{"SERVER_NAME":"127.0.0.1"}',
  1 => '{"SERVER_NAME":"127.0.0.2"}',
)
array (
  0 => 
  array (
    'url' => 'http://127.0.0.1:8080/',
    'content_type' => 'application/json; charset=utf-8',
    'http_code' => 200,
    'header_size' => 107,
    'request_size' => 53,
    'filetime' => -1,
    'ssl_verify_result' => 0,
    'redirect_count' => 0,
    'total_time' => 2.0013990000000002,
    'namelookup_time' => 5.3999999999999998E-5,
    'connect_time' => 0.00015799999999999999,
    'pretransfer_time' => 0.000194,
    'size_upload' => 0,
    'size_download' => 27,
    'speed_download' => 13,
    'speed_upload' => 0,
    'download_content_length' => -1,
    'upload_content_length' => 0,
    'starttransfer_time' => 0.00079699999999999997,
    'redirect_time' => 0,
    'certinfo' => 
    array (
    ),
    'primary_ip' => '127.0.0.1',
    'primary_port' => 8080,
    'local_ip' => '127.0.0.1',
    'local_port' => 57653,
    'redirect_url' => '',
  ),
  1 => 
  array (
    'url' => 'http://127.0.0.2:8080/',
    'content_type' => 'application/json; charset=utf-8',
    'http_code' => 200,
    'header_size' => 107,
    'request_size' => 53,
    'filetime' => -1,
    'ssl_verify_result' => 0,
    'redirect_count' => 0,
    'total_time' => 1.0012369999999999,
    'namelookup_time' => 1.1E-5,
    'connect_time' => 4.6999999999999997E-5,
    'pretransfer_time' => 6.3E-5,
    'size_upload' => 0,
    'size_download' => 27,
    'speed_download' => 26,
    'speed_upload' => 0,
    'download_content_length' => -1,
    'upload_content_length' => 0,
    'starttransfer_time' => 0.00063699999999999998,
    'redirect_time' => 0,
    'certinfo' => 
    array (
    ),
    'primary_ip' => '127.0.0.2',
    'primary_port' => 8080,
    'local_ip' => '127.0.0.1',
    'local_port' => 43645,
    'redirect_url' => '',
  ),
)

 

© 著作权归作者所有

eechen

eechen

粉丝 1023
博文 107
码字总数 55962
作品 1
深圳
私信 提问
加载中

评论(1)

php实现并发处理之curl篇

php在并发处理方面的确不如java好。但是也有一些方法可以实现并发处理。比如使用curl就可以实现url的并发请求。 看到网上有人说使用curl会导致阻塞,即所有的请求数据都获取完毕后一并返回,...

snowing1990
2016/03/29
62
0
rryqszq4/JsonRPC

JsonRPC 2.0 Client and Server 轻量级,高性能 JsonRPC 2.0 客户端和服务端的php扩展,基于 multicurl + epoll的并行客户端。JsonrpcClient使用libcurl库的并行接口调取服务,使用IO多路复用...

rryqszq4
2015/12/28
0
0
php中curl_multi函数集的用法

一、引言 这段时间比较忙,已经很久没有写博客了。今天我就来聊聊我关于curlmulti*函数集的使用心得,关于http请求的问题。 当我们用户php发起一个http请求的时候。我们会首先想到用什么?没...

林湾村龙猫
2016/11/28
38
0
PHP也玩并发,巧用curl 并发减少后端访问时间

说明:本人源自3篇博文 http://blog.csdn.net/zuiaituantuan/article/details/7048782 首先,先了解下 php中的curl多线程函数: # curl_multi_add_handle # curl_multi_close # curl_multi_......

晨曦之光
2012/03/09
9.6K
0
PHP采集相关教程之一 CURL函数库

先写一个简单的抓取页面函数 [php] view plaincopy <?php function GetSources($Url,$User_Agent='',$Referer_Url='') //抓取某个指定的页面 { //$Url 需要抓取的页面地址 //$User_Agent 需要......

蜗牛奔跑
2015/06/26
248
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部