当前位置: 首页 > news >正文

浅析PHP如何并行异步处理HTTP请求

在 PHP 中,由于其传统的同步阻塞模型,实现并行异步处理 HTTP 请求并不像其他语言(如 Go 或 Node.js)那样直接。不过,仍然可以通过一些扩展和工具来实现并行异步处理。以下是几种常见的方法:

1. 使用 cURL 的多线程功能

PHP 的 cURL 扩展支持多线程处理,可以通过 curl_multi_* 系列函数实现并行 HTTP 请求。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

$urls= [

'https://example.com/api/1',

'https://example.com/api/2',

'https://example.com/api/3',

];

$mh= curl_multi_init();// 初始化多线程 cURL

$handles= [];

foreach($urlsas$url) {

$ch= curl_init();

curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_multi_add_handle($mh,$ch);// 将单个 cURL 句柄添加到多线程中

$handles[] =$ch;

}

$running= null;

do{

curl_multi_exec($mh,$running);// 执行并行请求

curl_multi_select($mh);// 等待活动

}while($running> 0);

$responses= [];

foreach($handlesas$ch) {

$responses[] = curl_multi_getcontent($ch);// 获取每个请求的响应

curl_multi_remove_handle($mh,$ch);// 移除句柄

curl_close($ch);

}

curl_multi_close($mh);// 关闭多线程 cURL

print_r($responses);

优点:

  • 原生支持,无需额外扩展。
  • 可以并行处理多个 HTTP 请求。

缺点:

  • 代码复杂度较高。
  • 需要手动管理句柄和状态。

2. 使用 Guzzle 异步客户端

Guzzle 是一个流行的 PHP HTTP 客户端库,支持异步请求。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

require'vendor/autoload.php';

useGuzzleHttp\Client;

useGuzzleHttp\Promise;

$client=newClient();

$urls= [

'https://example.com/api/1',

'https://example.com/api/2',

'https://example.com/api/3',

];

$promises= [];

foreach($urlsas$url) {

$promises[] =$client->getAsync($url);// 发起异步请求

}

$responses= Promise\Utils::settle($promises)->wait();// 等待所有请求完成

foreach($responsesas$response) {

if($response['state'] ==='fulfilled') {

echo$response['value']->getBody() ."\n";// 输出响应内容

}else{

echo'Request failed: '.$response['reason']->getMessage() ."\n";

}

}

优点:

  • 代码简洁,易于使用。
  • 支持并发请求和异步处理。

缺点:

需要安装 Guzzle 库。

3. 使用 Swoole 扩展

Swoole 是一个高性能的 PHP 扩展,支持异步、协程和并行处理。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Swoole\Runtime::enableCoroutine();// 启用协程

$urls= [

'https://example.com/api/1',

'https://example.com/api/2',

'https://example.com/api/3',

];

$responses= [];

go(function()use($urls, &$responses) {

$client=newSwoole\Coroutine\Http\Client('example.com', 443, true);

foreach($urlsas$url) {

$client->get($url);

$responses[] =$client->body;

}

});

Swoole\Event::wait();// 等待所有协程完成

print_r($responses);

优点:

  • 高性能,支持协程和异步 I/O。
  • 适合高并发场景。

缺点:

  • 需要安装 Swoole 扩展。
  • 学习曲线较高。

4. 使用 ReactPHP

ReactPHP 是一个基于事件驱动的 PHP 库,支持异步编程。

示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

require'vendor/autoload.php';

useReact\EventLoop\Factory;

useReact\HttpClient\Client;

useReact\HttpClient\Response;

$loop= Factory::create();

$client=newClient($loop);

$urls= [

'https://example.com/api/1',

'https://example.com/api/2',

'https://example.com/api/3',

];

foreach($urlsas$url) {

$request=$client->request('GET',$url);

$request->on('response',function(Response$response) {

$response->on('data',function($chunk) {

echo$chunk;

});

});

$request->end();

}

$loop->run();

优点:

  • 基于事件驱动,适合异步编程。
  • 支持长连接和流式处理。

缺点:

  • 需要安装 ReactPHP 库。
  • 代码复杂度较高。

5. 使用多进程(pcntl 扩展)

PHP 的 pcntl 扩展支持多进程编程,可以通过创建子进程来实现并行处理。

http://www.jsqmd.com/news/592947/

相关文章:

  • 5步解锁AMD显卡AI潜能:ollama-for-amd本地化部署全指南
  • FontForge字体设计:从零到专业字体的免费创作之路 ✨
  • 永磁同步电机PMSM三环位置速度电流伺服控制系统的控制模型
  • Ansys Maxwell变压器综合教程:基础操作与案例分析,含模型文件及电性仿真教学
  • 从 IApplicationBuilder 到 RequestDelegate:ASP.NET Core 请求管线的性能与可观测性实战
  • GME-Qwen2-VL-2B-Instruct效果展示:金融产品宣传图与合规文案匹配度审计案例
  • Python 爬虫 scrapy response.css几种找到数据的方法
  • ConvNeXt 改进 :ConvNeXt 添加IIA注意机制(信息整合注意力,TGRS 2025),二次创新CNBlock结构 ,实现涨点,独家首发
  • C# Winform通用开发框架,支持多语言,多数据库,自动更新,模块化,可用其开发任意CS端系统
  • 5步掌握YimMenu:GTA5终极防崩溃菜单完整指南
  • 利用快马平台快速将notepad++笔记构思转化为可交互网页应用原型
  • 卫星姿态轨道控制simulink仿真/姿轨控 卫星姿轨控仿真,基于simulink 自己在国外...
  • uds bootloader stm32 完整方案 iso15765 iso14429 简化学...
  • 一文读懂 Skill 与 MCP 是什么?有什么区别?(附研发各场景 Skill 推荐清单)
  • Amadeus的知识库 | 传统检索不懂语义?大模型知识有限?—— RAG检索增强生成来帮忙!
  • 雷赛HBS86闭环步进驱动方案代码功能说明
  • 抖音批量下载全攻略:一键保存无水印视频,轻松管理海量内容
  • 多页原理图设计救星:用AD端口交叉引用快速定位信号流向(含Ctrl跳转技巧)
  • Windows快捷键冲突终结者:Hotkey Detective 5分钟快速定位秘籍
  • 永磁同步电机2D电磁仿真模型代码功能说明
  • 打卡信奥刷题(3066)用C++实现信奥题 P6877 [JOI 2020 Final] 只不过是长的领带 / Just Long Neckties
  • 新手避坑指南:用RT-Thread Studio和星火一号,5分钟搞定AHT10温湿度采集与阿里云MQTT上传
  • vant-weapp版本迁移检查清单
  • 3个抖音内容管理痛点与开源下载工具的解决方案
  • MTKClient终极指南:解锁联发科设备的完整刷机与逆向工程工具
  • ComfyUI Manager管理工具完全指南:优化工作流与资源配置的实战手册
  • 2026最权威的五大降AI率方案实测分析
  • 基于S7-200PLC的PID模糊控制电子皮带秤自动配料系统设计:梯形图程序详解与接线图、io...
  • 2025届学术党必备的十大降AI率工具推荐
  • 终极MaaYuan自动化助手:5分钟快速部署代号鸢日常任务解放双手方案