php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数。

本案例用来测试大并发的情况下 curl_multi_init() 到底比 curl_init() 快多少。

话不多少,直接上代码:

<?php
class Http
{
/**
* https 发起post请求
* @param string $url url信息
* @param mixed $data 参数信息[$data = '{"a":1,"b":2}' or $data = array("a" => 1,"b" => 2)]
* @param int $timeOut 超时设置
* @param string $proxyHost 代理host
* @param int $proxyPort 代理端口
* @return string
*/
public static function post($url, $data = null, $timeOut = , $proxyHost = null, $proxyPort = null)
{
try {
if (strlen($url) < ) {
return null;
} $ch = curl_init();
// 设置url
curl_setopt($ch, CURLOPT_URL, $url);
if (false == empty($data)) {
curl_setopt($ch, CURLOPT_POST, );
if (is_array($data) && count($data) > ) {
curl_setopt($ch, CURLOPT_POST, count($data));
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 如果成功只将结果返回,不自动输出返回的内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, );
// user-agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
// 超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut); // 使用代理
if (strlen($proxyHost) > && strlen($proxyPort) > ) {
// 代理认证模式
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
// 代理服务器地址
curl_setopt($ch, CURLOPT_PROXY, $proxyHost);
// 代理服务器端口
curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
// 使用http代理模式
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
} // 执行
$out = curl_exec($ch);
// 关闭
curl_close($ch);
return $out;
} catch (Exception $e) {
return null;
} } /**
* https 发起post多发请求
* @param array $nodes url和参数信息。
* $nodes = [
* [0] = > [
* 'url' => 'http://www.baidu.com',
* 'data' => '{"a":1,"b":2}'
* ],
* [1] = > [
* 'url' => 'http://www.baidu.com',
* 'data' => null
* ]
* ....
* ];
* @param int $timeOut 超时设置
* @return array
*/
public static function postMulti($nodes, $timeOut = )
{
try {
if (false == is_array($nodes)) {
return array();
} $mh = curl_multi_init();
$curlArray = array();
foreach ($nodes as $key => $info) {
if (false == is_array($info)) {
continue;
}
if (false == isset($info['url'])) {
continue;
} $ch = curl_init();
// 设置url
$url = $info['url'];
curl_setopt($ch, CURLOPT_URL, $url); $data = isset($info['data']) ? $info['data'] : null;
if (false == empty($data)) {
curl_setopt($ch, CURLOPT_POST, );
// array
if (is_array($data) && count($data) > ) {
curl_setopt($ch, CURLOPT_POST, count($data));
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
} curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// 如果成功只将结果返回,不自动输出返回的内容
curl_setopt($ch, CURLOPT_RETURNTRANSFER, );
// user-agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0");
// 超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeOut); $curlArray[$key] = $ch;
curl_multi_add_handle($mh, $curlArray[$key]);
} $running = NULL;
do {
usleep();
curl_multi_exec($mh, $running);
} while ($running > ); $res = array();
foreach ($nodes as $key => $info) {
$res[$key] = curl_multi_getcontent($curlArray[$key]);
}
foreach ($nodes as $key => $info) {
curl_multi_remove_handle($mh, $curlArray[$key]);
}
curl_multi_close($mh);
return $res;
} catch (Exception $e) {
return array();
} } } $count = ; //2.1 循环调用Http::post() 100次
$url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=abcdasdfasdfasdfasdfasdfasdfasdfasdfasdf';
$startTime = microtime(true);
for ($i = ; $i <= $count; $i++) {
$res = Http::post($url);
}
$endTime = microtime(true); echo $endTime - $startTime;
echo "\n"; //2.2 调用Http::postMulti()一次发100个url
$url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=abcdasdfasdfasdfasdfasdfasdfasdfasdfasdf';
$nodes = array();
for ($i = ; $i <= $count; $i++) {
$info = array();
$info['url'] = $url;
$nodes[] = $info;
} $startTime = microtime(true);
$res = Http::postMulti($nodes);
$endTime = microtime(true); echo $endTime - $startTime;
echo "\n"; ?>

运行结果:

* 当$count=10的情况下,耗时分别为:

3.4119510650635
0.44486904144287

curl_multi_init() 比 curl_init() 快了8倍。

* 当 $count=100的情况下,耗时分别为:

34.190015077591
1.9350771903992

curl_multi_init() 比 curl_init() 快了17倍。

PHP多线程 curl_multi_init 的使用的更多相关文章

  1. php中ob_get_contents、curl_multi_init、curl_init多线程下载远程图片并保存记录

    php中三种方式测试图片下载效率 原文共24张不同图,每张大小在500K以上 使用时注意调整传入数组格式以及需要下载时保存地址的路径格式等 这三种方式无需额外安装扩展,方便快捷易操作[虽然效率看结果没 ...

  2. php curl 多线程方法

    <?php /** * curl 多线程 * @param array $array 并行网址 * @param int $timeout 超时时间 * @return array */ fun ...

  3. PHP利用Curl实现多线程抓取网页和下载文件

    PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery ...

  4. php多线程抓取信息测试例子

    php多线程抓取信息测试例子 PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. PHP扩展下载:htt ...

  5. PHP模拟发送POST请求之五curl基本使用和多线程优化

    今天来介绍PHP模拟发送POST请求的重型武器——cURL函数库的使用和其多线程的优化方法. 说起cURL函数,可谓是老生常谈,但网上许多资料都在关键部分语焉不详,列出一大堆手册上的东西,搞得我入门时 ...

  6. PHP CURL 多线程 GET/POST 类

    PHP CURL 多线程 GET/POST 类 2015-01-01 分类:技术文章 阅读(623) 评论(0) 如果有需要更正或更高效的建议,欢迎在OSchina分享~\(≧▽≦)/~ http:/ ...

  7. php curl多线程抓取网页

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...

  8. 简单的使用php多线程抓取网页

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...

  9. 使用CURL发彩信,短信和进行多线程

    短彩信发送 01 $xml_data = '<?xml version="1.0" encoding="UTF-8" standalone="y ...

随机推荐

  1. Python学习笔记九

    Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...

  2. 集腋成裘-09-ECharts -HelloECharts-02

    上一篇我们讲了可视化数据分析的重要性以及ECharts的一些的特性,这一篇我们继续学习一下ECharts的简单Demo 一:5 分钟上手 ECharts <!DOCTYPE html> & ...

  3. js-事件以及window操作

    属性 当以下情况发生时,出现此事件 onblur 元素失去焦点 onchange 用户改变域的内容 onclick 鼠标点击某个对象 ondblclick 鼠标双击某个对象 onfocus 元素获得焦 ...

  4. manjaro安装及设置

    因我的笔记本(联想的拯救者)昨晚打开后什么都还没做就被更新系统“抢走”了画面导致按什么都不管用 所以就想起能不能不用win系统,都知道linux比win稳定,so....就找到了manjaro.以下是 ...

  5. 关于H5页面在iPhoneX适配

    ​1.  iPhoneX的介绍 屏幕尺寸 我们熟知的iPhone系列开发尺寸概要如下: △ iPhone各机型的开发尺寸 转化成我们熟知的像素尺寸: △ 每个机型的多维度尺寸 倍图其实就是像素尺寸和开 ...

  6. DWM1000 定位上位机软件 以及 源码下载

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 经过一段学习,今天终于将定位软件编译成功,简单修改,可以正确读取串口的数据了. 主要修改点: 1 官方 ...

  7. TypeScript系列 - 什么是TypeScript

    看了很多关于TypeScript的文章,总体说来没有很好的,一个系统的学习TypeScript的资源. 接下来,我将给大家带来TypeScript的系列,让你和我一样,一步一步的学习TypeScrip ...

  8. 小甲鱼Python第二十讲课后习题---021

    笔记: 1.lambda表达式的作用: 1)Python写一些执行脚本时,使用lambda就可以省下定义函数的过程,比如说我们只是需要写一个简单的脚本来管理服务器时间,我们就不需要专门定义一个函数然后 ...

  9. (63)Wangdao.com第十天_预处理、预解析_函数 上下文对象、参数列表对象

    预解析.预处理 1. 在全局代码执行之前,js 引擎 就会创建一个栈来存储管理所有的 执行上下文对象 2. 在 全局执行上下文 window 确定以后,进行压栈 3. 在 函数执行上下文对象 确定以后 ...

  10. JavaScript学习day3 (基本语法下)

    if/else for while 函数的使用 JavaScript语句 if/else 语句 JavaScript 中的if/else 判断选择,语法格式是这样的 switch/case 语句 在做 ...