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网站来路获取代码(针对搜索引擎)
Jun 08 PHP
coreseek 搜索英文的问题详解
Jun 08 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
php缩放gif和png图透明背景变成黑色的解决方法
Oct 14 PHP
symfony表单与页面实现技巧
Jan 26 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 PHP
PHP中define() 与 const定义常量的区别详解
Jun 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
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
js获取当前年月日-YYYYmmDD格式的实现代码
2016/06/01 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
使用jQuery实现购物车
2020/10/29 jQuery
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
python实现redis三种cas事务操作
2017/12/19 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
python写一个随机点名软件的实例
2019/11/28 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
python基于win32api实现键盘输入
2020/12/09 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
某公司C#程序员面试题笔试题
2014/05/26 面试题
手机被没收检讨书
2014/02/22 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
Python 中random 库的详细使用
2021/06/03 Python
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js