自己封装的php Curl并发处理,欢迎提出问题优化。
因为项目需要,发现一个一个发送请求实在太慢,无奈之下,我们可以封装一个并发处理的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并发处理,欢迎提出问题优化。的更多相关文章
- PHP模拟发送POST请求之五curl基本使用和多线程优化
今天来介绍PHP模拟发送POST请求的重型武器——cURL函数库的使用和其多线程的优化方法. 说起cURL函数,可谓是老生常谈,但网上许多资料都在关键部分语焉不详,列出一大堆手册上的东西,搞得我入门时 ...
- 封装一个使用cURL以POST方式请求https协议的公众方法
打开php7.2手册,搜索curl function getRequest($url,$type='get', $data = [], $timeout = 10) (需要更改){ $ssl = st ...
- python封装configparser模块获取conf.ini值(优化版)
昨天晚上封装了configparser模块,是根据keyname获取的value.python封装configparser模块获取conf.ini值 我原本是想通过config.ini文件中的sect ...
- 封装ajax,让调用变得简单优化
思考一下: 通常我们在使用ajax来发送接口请求时,每一次都会调用ajax固定的元素,比如data.url.method.success.error等.那么我们想一下能不能先把ajax封装起来,在每次 ...
- [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)
[评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...
- 拳打Adam,脚踢SGD:北大提出全新优化算法AdaBound
https://mp.weixin.qq.com/s/el1E-61YjLkhFd6AgFUc7w
- MySQL大数据高并发处理之-查询的优化
http://www.php1.cn/Content/MySQL_DaShuJuGaoBingFaChuLiZhi_-_ChaXunDeYouHua.html
- Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据
当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...
- MemCached Cache Java Client封装优化历程
1.什么是memcached?(从官网翻译翻译) 免费和开源.高性能.分布式内存对象缓存系统,通用在自然界,但用于加速动态web应用程序,减轻数据库负载. Memcached是一个内存中的键值存储为小 ...
随机推荐
- T51071 Tony到死都想不出の数学题
T51071 Tony到死都想不出の数学题 自己摘的题出了数据挂一下链接 \(a, b\) 均为整数 设 \(M(a)\) 为满足 \((a + b) | ab\) 的 \(b\) 的个数, 求 \( ...
- Chapter One:数据结构和算法-解压序列赋值给多个变量
一.问题: 现在有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量? 二.解决方案: 代码示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...
- np.diff函数
np.diff函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 数组中a[n]-a[n-1] import numpy as np a=np.array([1, 6, 7, 8, 12]) ...
- SQL Server 属性不匹配。存在属性(Directory, Archive),包括属性(0),不包括属性(Archive, Compressed, Encrypted)
问题:安装SQL SERVER 2008报错 “存在属性(Directory, Archive),包括属性(0),不包括属性(Archive, Compressed, Encrypted)” 解决办法 ...
- Jekens 配置多项目SCM GitLab+Jenkins持续集成环境
参考: 搭建GitLab+Jenkins持续集成环境图文教程 https://blog.csdn.net/ruangong1203/article/details/73065410 Jenkins中配 ...
- 【CodeForces】961 G. Partitions 斯特林数
[题目]G. Partitions [题意]n个数$w_i$,每个非空子集S的价值是$W(S)=|S|\sum_{i\in S}w_i$,一种划分方案的价值是所有非空子集的价值和,求所有划分成k个非空 ...
- P1879 [USACO06NOV]玉米田Corn Fields (状压dp入门)
题目链接: https://www.luogu.org/problemnew/show/P1879 具体思路: 我们可以先把所有合法的情况枚举出来,然后对第一行判断有多少种情况满足,然后对于剩下的行数 ...
- C++ Primer 5th 第14章 重载运算与类型转换
当运算符作用域类类型的对象时,可以通过运算符重载来重新定义该运算符的含义.重载运算符的意义在于我们和用户能够更简洁的书写和更方便的使用代码. 基本概念 重载的运算符是具有特殊名字的函数:函数名由关键词 ...
- [转]使用 C++11 编写 Linux 多线程程序
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...
- 如何和统计学家分享数据How to share data with a statistician
如何和统计学家分享数据 原文地址:https://github.com/jtleek/datasharing 将原文渣翻译的版本. 这是一份指南给需要分享数据给统计学家或者数据科学家的任何人.我认为的 ...