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 用checkbox一次性删除多条记录的方法
Feb 23 PHP
深入理解PHP原理之异常机制
Aug 21 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
Aug 14 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
Jun 23 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
Laravel框架Blade模板简介及模板继承用法分析
Dec 03 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输出时间差函数代码
2013/01/28 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
js读取本地文件的实例
2017/12/22 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Python set常用操作函数集锦
2017/11/15 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
python 实现客户端与服务端的通信
2020/12/23 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
运动会跳远加油稿
2014/02/20 职场文书
计划生育标语
2014/06/23 职场文书
毕业生实习证明
2014/09/19 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
如何在Python项目中引入日志
2021/05/31 Python
python三子棋游戏
2022/05/04 Python