因为项目需要,发现一个一个发送请求实在太慢,无奈之下,我们可以封装一个并发处理的curl请求批处理句柄来减少重复创建句柄的问题

代码如下:

/*
*@param array $data url的参数
*@param string $url url地址
*@return array $retsult 结果序列
*/
function getmulti($data,$url){
//组合url参数
$ch = array();
$mh = curl_multi_init();
$result = array();
foreach ($data as $k => $v) {
$query[$k] = http_build_query($v);
$ch[$k] = curl_init();
$options = array(
CURLOPT_URL=> $url.'?'.$query[$k],
CURLOPT_TIMEOUT => 50,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => TRUE,
);
curl_setopt_array($ch[$k], $options); curl_multi_add_handle($mh,$ch[$k]);
}
$active = null;
// 执行批处理句柄
do {
$mrc = curl_multi_exec($mh, $active);
} while ($active > 0);
foreach ($ch as $ck => $cv) {
$result[] = curl_multi_getcontent($cv);
usleep(1);
curl_multi_remove_handle($mh, $cv);
} curl_multi_close($mh); //echo $options[CURLOPT_URL];die(); return $result;
}
//example:
$data = array(
'happy'=>array('emotion'=>'happy', 'tag'=>'男人'),
'anger'=>array('emotion'=>'anger', 'tag'=>'男人'),
'sad'=>array('emotion'=>'sad', 'tag'=>'男人'),
'fear'=>array('emotion'=>'fear', 'tag'=>'男人'),
'surprise'=>array('emotion'=>'surprise', 'tag'=>'男人'),
'none'=>array('emotion'=>'none', 'tag'=>'男人'),
);
$newdata = array();
$hotres = '';
$url = 'http://www.xxx.com/demo/getEmotionDetails.jsp';
$startime = time().'<br />';
echo '开始时间:'.$startime;
foreach ($data as $k=>$v){
//$hotres = $this->get($data, $url);
//$hotres = $this->get($v, $url);
$hotres = file_get_contents($url.'?'.http_build_query($v));
//$newdata[] = object_to_array(json_decode($hotres));
$newdata[] = $hotres;
}
/* foreach ($hotres as $hk=>$hv){
$newdata[$data[$hk]['emotion']] = object_to_array(json_decode($hv));
} */
echo '消耗时间:'.(time()-$startime).'<br />';
echo '结束时间:'.time().'<br />'; echo '<pre>';print_r($newdata);exit;

自己封装的php Curl并发处理,欢迎提出问题优化。的更多相关文章

  1. PHP模拟发送POST请求之五curl基本使用和多线程优化

    今天来介绍PHP模拟发送POST请求的重型武器——cURL函数库的使用和其多线程的优化方法. 说起cURL函数,可谓是老生常谈,但网上许多资料都在关键部分语焉不详,列出一大堆手册上的东西,搞得我入门时 ...

  2. 封装一个使用cURL以POST方式请求https协议的公众方法

    打开php7.2手册,搜索curl function getRequest($url,$type='get', $data = [], $timeout = 10) (需要更改){ $ssl = st ...

  3. python封装configparser模块获取conf.ini值(优化版)

    昨天晚上封装了configparser模块,是根据keyname获取的value.python封装configparser模块获取conf.ini值 我原本是想通过config.ini文件中的sect ...

  4. 封装ajax,让调用变得简单优化

    思考一下: 通常我们在使用ajax来发送接口请求时,每一次都会调用ajax固定的元素,比如data.url.method.success.error等.那么我们想一下能不能先把ajax封装起来,在每次 ...

  5. [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)

    [评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...

  6. 拳打Adam,脚踢SGD:北大提出全新优化算法AdaBound

    https://mp.weixin.qq.com/s/el1E-61YjLkhFd6AgFUc7w

  7. MySQL大数据高并发处理之-查询的优化

    http://www.php1.cn/Content/MySQL_DaShuJuGaoBingFaChuLiZhi_-_ChaXunDeYouHua.html

  8. Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据

    当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...

  9. MemCached Cache Java Client封装优化历程

    1.什么是memcached?(从官网翻译翻译) 免费和开源.高性能.分布式内存对象缓存系统,通用在自然界,但用于加速动态web应用程序,减轻数据库负载. Memcached是一个内存中的键值存储为小 ...

随机推荐

  1. 如何创建一个 Lua 模块

    如何创建一个 Lua 模块 翻译自: How to Create a Lua Module 译者: FreeBlues 正文 Lua编程语言 中的一个 模块(module)是一个包含函数和变量的代码片 ...

  2. 掌握Markdown

    翻译自 https://guides.github.com/features/mastering-markdown/ 转载请注明链接 掌握Markdown Markdown是Github平台上一种轻量 ...

  3. Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)

    高级教程:如何编写可重用的app (page 13) 本节教程上接第七部分(Page 12).我们会把我们的 web-poll应用转换成一个独立的python包,你可以在新的项目中重用或者把它分享给其 ...

  4. 100 Most Popular Machine Learning Video Talks

    100 Most Popular Machine Learning Video Talks 26971 views, 1:00:45,  Gaussian Process Basics, David ...

  5. IEnumerable 与 IQueryable

    无论是在ado.net EF或者是在其他的Linq使用中,我们经常会碰到两个重要的静态类Enumerable.Queryable,他们在System.Linq命名空间下.那么这两个类是如何定义的,又是 ...

  6. CSS3实战-文字篇

    text-shadow的大作用 多颜色阴影效果,用逗号分隔text-shaodow即可. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  7. javascript iframe相关操作

    1. 获得iframe的window对象 iframeElement.contentWindow 2. 获得iframe的document对象 存在跨域访问限制. chrome:iframeEleme ...

  8. H.265 Video Encoder IP Core

    复制: 开源H.265硬件视频编码器H.265 Video Encoder IP Core是开源的H.265硬件视频编码器,实现了H.265(或叫HEVC)的大部分功能. 它由复旦大学专用集成电路与系 ...

  9. JS设计模式——12.装饰者模式

    装饰者模式概述 本章讨论的是一种为对象添加特性的技术,她并不使用创建新子类这种手段. 装饰者模式可以用来透明的把对象包装在具有同样接口的另一个对象中.这样一来,就可以给一个方法添加一些行为,然后将方法 ...

  10. Unix/Linux系统时间函数API

    首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...