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编程中字符串处理的5个技巧小结
Nov 13 PHP
PHP开发框架总结收藏
Apr 24 PHP
mysql下创建字段并设置主键的php代码
May 16 PHP
PHP原理之异常机制深入分析
Aug 08 PHP
php中获取指定IP的物理地址的代码(正则表达式)
Jun 23 PHP
php 如何获取数组第一个值
Aug 06 PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 PHP
php+mysql查询优化简单实例
Jan 13 PHP
Laravel 5 框架入门(四)完结篇
Apr 09 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 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编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
python格式化字符串实例总结
2014/09/28 Python
python 日期操作类代码
2018/05/05 Python
django项目搭建与Session使用详解
2018/10/10 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
Python缓存技术实现过程详解
2019/09/25 Python
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
环保建议书
2014/03/12 职场文书
公司贷款承诺书
2014/05/30 职场文书
驾驶员安全责任书
2014/07/22 职场文书
美德少年事迹材料1000字
2014/08/21 职场文书
2014年建筑工作总结
2014/11/26 职场文书
青涩记忆观后感
2015/06/18 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
mysql sock文件存储了什么信息
2022/07/15 MySQL
一文解答什么是MySQL的回表
2022/08/05 MySQL