PHP curl批处理及多请求并发实现方法分析


Posted in PHP onAugust 15, 2018

本文实例讲述了PHP curl批处理及多请求并发实现方法。分享给大家供大家参考,具体如下:

在面试过程中遇到一个问题,加入一个一个网站访问一次需要两秒,我们如何实现在2秒左右请求三次?

面试官想问的就是如何使用curl并发处理请求

关于curl_multi_init()

一般来说,想到要用curl_multi_init()时,目的是要同时请求多个url,而不是一个一个依次请求,否则就要curl_init()了。

不过,在使用curl_multi的时候,你可能遇到cpu消耗过高、网页假死等现象,可以看看《PHP使用curl_multi_select解决curl_multi网页假死问题》

使用curl_multi的步骤总结如下:

  • 第一步:调用curl_multi_init
  • 第二步:循环调用curl_multi_add_handle

    这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。

  • 第三步:持续调用curl_multi_exec
  • 第四步:根据需要循环调用curl_multi_getcontent获取结果
  • 第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
  • 第六步:调用curl_multi_close

各函数作用解释:

curl_multi_init()
初始化一个curl批处理句柄资源。

curl_multi_add_handle()
向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。

curl_multi_exec()
解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。

curl_multi_remove_handle()
移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。

curl_multi_close()
关闭一个批处理句柄资源。

curl_multi_getcontent()
在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。

curl_multi_info_read()
获取当前解析的curl的相关传输信息。

示例代码:

<?php
// 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();
// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
// 创建批处理cURL句柄
$mh = curl_multi_init();
// 增加2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$running=null;
// 执行批处理句柄
do {
  usleep(10000);
  curl_multi_exec($mh,$running);
} while ($running > 0);
// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>

获取批处理后的结果:

PHP curl批处理及多请求并发实现方法分析

string curl_multi_getcontent ( resource $ch )

ch是由 curl_init() 返回的 cURL 句柄。

参考:

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php在字符串中查找另一个字符串
Nov 19 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
php上传文件常见问题总结
Feb 03 PHP
php采用session实现防止页面重复刷新
Dec 24 PHP
PHP实现的浏览器检查类
Apr 11 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
PHP实现的曲线统计图表示例
Nov 10 PHP
php实现水印文字和缩略图的方法示例
Dec 29 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
Dec 21 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 PHP
PHP ob缓存以及ob函数原理实例解析
Nov 13 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 #PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 #PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 #PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 #PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 #PHP
php+croppic.js实现剪切上传图片功能
Aug 14 #PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 #PHP
You might like
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
JavaScript中的闭包原理分析
2010/03/08 Javascript
js闭包的用途详解
2014/11/09 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
python编程线性回归代码示例
2017/12/07 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
解析Python3中的Import
2019/10/13 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
Python如何绘制日历图和热力图
2020/08/07 Python
python3中编码获取网页的实例方法
2020/11/16 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
适用于所有创业者的创业计划书
2014/02/05 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
小学生安全演讲稿
2014/04/25 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
文明班级申报材料
2014/12/24 职场文书
监守自盗观后感
2015/06/10 职场文书
幼儿园六一主持词
2015/06/30 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers