自己封装的php Curl并发处理,欢迎提出问题优化。
2024-09-15 04:37:51
因为项目需要,发现一个一个发送请求实在太慢,无奈之下,我们可以封装一个并发处理的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;
最新文章
- Linux 命令备忘录(CentOS 7)
- C语言初学者代码中的常见错误与瑕疵(23)
- 程序中的@Override是什么意思
- 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结
- Redis的简单介绍及在Windows下环境搭建
- hdu 4267 树形DP
- jquery个人笔记
- JavaScript高级程序设计—阅读笔记(第一部分)
- PureMVC(JS版)源码解析(五):SimpleCommand类
- 新浪微博布局学习——妙用TabHost
- listbox多选实现上下移动 js版和服务器版
- angularJS 系列(五)--controller AS 语法
- oracle目录操作
- python每天一个小练习-列表元素非唯一
- 【Python】【BugList13】req = requests.get(url=target)报错: (Caused by SSLError(SSLError(1, &#39;[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)&#39;)
- shell的case用法
- HTML自定义滚动条(仿网易邮箱滚动条)转载
- java-03-动手动脑
- spyder里的";查找文件里的特定字符串";非常方便
- Redis——基础数据结构