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 图片上传类代码
Jul 17 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
浅析php工厂模式
Nov 25 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
php去掉文件前几行的方法
Jul 29 PHP
PHP验证码生成原理和实现
Jan 24 PHP
使用vs code编辑调试php配置的方法
Jan 29 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
yii2.0框架场景的简单使用示例
Jan 25 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中文本操作的类
2007/03/17 PHP
Dedecms常用函数解析
2008/02/01 PHP
php将会员数据导入到ucenter的代码
2010/07/18 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
jQuery实现多级联动下拉列表查询框
2016/01/18 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
多版本Python共存的配置方法
2017/05/22 Python
python实现自动解数独小程序
2019/01/21 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
电脑教师的自我评价
2013/12/18 职场文书
会计专业自我评价
2014/02/12 职场文书
日化店促销方案
2014/03/26 职场文书
安全生产责任书范本
2014/04/15 职场文书
给校长的建议书300字
2014/05/16 职场文书
优秀教师先进材料
2014/12/16 职场文书
先进集体申报材料
2014/12/25 职场文书
大学生个人年度总结范文
2015/02/15 职场文书
思想道德自我评价2015
2015/03/09 职场文书
Mysql中mvcc各场景理解应用
2022/08/05 MySQL