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 相关文章推荐
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 PHP
PHP实时显示输出
Oct 02 PHP
php学习笔记之面向对象
Nov 08 PHP
详谈PHP文件目录基础操作
Nov 11 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
smarty模板引擎从php中获取数据的方法
Jan 22 PHP
php实现的简单检验登陆类
Jun 18 PHP
php实现图片等比例缩放代码
Jul 23 PHP
php导出生成word的方法
Dec 25 PHP
PHP中字符与字节的区别及字符串与字节转换示例
Oct 15 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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 explode函数实例代码
2012/02/27 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
vue中监听返回键问题
2019/08/28 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
夜不归宿检讨书
2014/02/25 职场文书
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
颐和园导游词400字
2015/01/30 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
解决vue中provide inject的响应式监听
2022/04/19 Vue.js
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android
Spring Boot实现文件上传下载
2022/08/14 Java/Android