PHP同时发起多个curl请求 原理与代码实现

相信熟悉的朋友们都知道,当用户以php发起一个http请求的时候。我们会首先想到用什么?没错,我们会创建一个curl来请求。

 

但是:当我们在一次执行中需要发起多个http请求呢?解决这个也很简单,只需要对每一个URL发起一次curl请求,请求完第1个、再请求第2个…......等等。

 

如果仅仅是这样,那我们还讲什么呢?也不是开此篇内容的目的。

 

一、多次简单的curl请求弊端

 

先给大家看一下串行请求与并行请求,如下图:

串行请求与并行请求

 

我们再举个例子:

现在有3个http请求,每个请求耗时2s。如果按照简单的curl(如图(1)串行请求),需要耗时6s,这是不能容忍的。如果请求的个数越多耗时会更多。

 

有没有一种方式来缩小查询时间?能不能3个http请求同时执行?(如图(2)并行请求)

当然也有很多方法来解决这个问题,将耗时减少到2s。

例如:多进程、线程、事件循环、curl_multi_*  等等。PHP这里最简单的方式就是通过 curl_multi_* 函数来完成。事实上 curl_multi_* 内部实现就是用的事件循环。

 

二、PHP同时发起多个curl请求 实现代码

由于PHP已经出也相关的:curl_multi_* 函数,我们只需要用它就可以实现PHP同时发起多个curl请求。

php curl官方手册: http://php.net/manual/zh/book.curl.php

 

1、简单示例代码

<?php
// 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "https://www.fujieace.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);

?>

 

2、复杂的示例代码

curl_multi_*函数实现的HTTP压测工具:

https://github.com/hirudy/phplib/blob/master/phpAb.php

 

curl_multi_*实现的http请求类:

https://github.com/hirudy/phplib

 

我这实现了一个通过协程+curl_multi_*的爬虫框架。单进程可处理请求2000-5000/min。

Tspider:https://github.com/hirudy/Tspider

    A+
发布日期:2021年03月12日 13:14:02  所属分类:PHP
最后更新时间:2021-03-12 13:14:02
评分: (1 票;平均数5.00 ;最高评分 5 ;用户总数1;总得分 5;百分比100.00)
付杰
Python爬虫教程:零基础上手Scrapy分布爬虫
  • ¥ 388.0元
  • 市场价:388.0元
Swoole项目实战(第二季)
  • ¥ 99.0元
  • 市场价:99.0元
React.js视频教程:全新React.js16.12技术合集
  • ¥ 69.0元
  • 市场价:69.0元
wordpress站群服务 泛解析二级域名 二级目录
wordpress站群服务 泛解析二级域名 二级目录
  • ¥ 1999.9元
  • 市场价:8999元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0

  1. 头像 何先生 0

    学到了!