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

PHP是如何并行异步处理HTTP请求的?

文章精选推荐

1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
7 Cursor 设备ID修改器,你的Cursor又可以继续试用了

文章正文

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

1. 使用 cURL 的多线程功能

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

示例代码:
$urls = ['https://example.com/api/1','https://example.com/api/2','https://example.com/api/3',
];$mh = curl_multi_init(); // 初始化多线程 cURL
$handles = [];foreach ($urls as $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 ($handles as $ch) {$responses[] = curl_multi_getcontent($ch); // 获取每个请求的响应curl_multi_remove_handle($mh, $ch); // 移除句柄curl_close($ch);
}curl_multi_close($mh); // 关闭多线程 cURLprint_r($responses);
优点:
  • 原生支持,无需额外扩展。
  • 可以并行处理多个 HTTP 请求。
缺点:
  • 代码复杂度较高。
  • 需要手动管理句柄和状态。

2. 使用 Guzzle 异步客户端

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

示例代码:
require 'vendor/autoload.php';use GuzzleHttp\Client;
use GuzzleHttp\Promise;$client = new Client();$urls = ['https://example.com/api/1','https://example.com/api/2','https://example.com/api/3',
];$promises = [];
foreach ($urls as $url) {$promises[] = $client->getAsync($url); // 发起异步请求
}$responses = Promise\Utils::settle($promises)->wait(); // 等待所有请求完成foreach ($responses as $response) {if ($response['state'] === 'fulfilled') {echo $response['value']->getBody() . "\n"; // 输出响应内容} else {echo 'Request failed: ' . $response['reason']->getMessage() . "\n";}
}
优点:
  • 代码简洁,易于使用。
  • 支持并发请求和异步处理。
缺点:
  • 需要安装 Guzzle 库。

3. 使用 Swoole 扩展

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

示例代码:
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 = new Swoole\Coroutine\Http\Client('example.com', 443, true);foreach ($urls as $url) {$client->get($url);$responses[] = $client->body;}
});Swoole\Event::wait(); // 等待所有协程完成print_r($responses);
优点:
  • 高性能,支持协程和异步 I/O。
  • 适合高并发场景。
缺点:
  • 需要安装 Swoole 扩展。
  • 学习曲线较高。

4. 使用 ReactPHP

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

示例代码:
require 'vendor/autoload.php';use React\EventLoop\Factory;
use React\HttpClient\Client;
use React\HttpClient\Response;$loop = Factory::create();
$client = new Client($loop);$urls = ['https://example.com/api/1','https://example.com/api/2','https://example.com/api/3',
];foreach ($urls as $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 扩展支持多进程编程,可以通过创建子进程来实现并行处理。

示例代码:
$urls = ['https://example.com/api/1','https://example.com/api/2','https://example.com/api/3',
];$children = [];foreach ($urls as $url) {$pid = pcntl_fork();if ($pid == -1) {die('Could not fork');} elseif ($pid) {$children[] = $pid; // 父进程记录子进程 ID} else {// 子进程处理请求echo file_get_contents($url) . "\n";exit(); // 子进程退出}
}// 父进程等待所有子进程完成
foreach ($children as $pid) {pcntl_waitpid($pid, $status);
}
优点:
  • 真正的并行处理。
  • 适合 CPU 密集型任务。
缺点:
  • 需要 pcntl 扩展。
  • 进程间通信复杂。

总结

  • cURL 多线程:适合简单的并行 HTTP 请求。
  • Guzzle:代码简洁,适合大多数场景。
  • Swoole:高性能,适合高并发场景。
  • ReactPHP:基于事件驱动,适合异步编程。
  • 多进程:适合 CPU 密集型任务,但复杂度较高。

根据具体需求选择合适的方法即可。

相关文章:

PHP是如何并行异步处理HTTP请求的?

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...

【Spring详解一】Spring整体架构和环境搭建

一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构,包含一系列功能要素,被分为大约20个模块 Spring核心容器:包含Core、Bean、Context、Expression Language模块 Core :其他组件的基本核心&#xff…...

在 Vue 3 中使用 Lottie 动画:实现一个加载动画

在现代前端开发中,动画是提升用户体验的重要元素之一。Lottie 是一个流行的动画库,它允许我们使用 JSON 文件来渲染高质量的动画。本文将介绍如何在 Vue 3 项目中集成 Lottie 动画,并实现一个加载动画效果。 如果对你有帮助请帮忙点个&#x…...

深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作

一、问题背景(传统爬虫的痛点) 数据采集是现代网络爬虫技术的核心任务之一。然而,传统爬虫面临多重挑战,主要包括: 反爬机制:许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫,进而限制…...

MySQL 主从复制原理及其工作过程

一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…...

计算机网络抄手 运输层

一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...

字符串函数和结构题内存对齐

图下为函数使用&#xff1a; #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }...

【嵌入式Linux应用开发基础】特殊进程

目录 一、守护进程&#xff08;Daemon Process&#xff09; 1.1. 概念 1.2. 特点 1.3. 守护进程的命名 1.4. 创建守护进程的步骤 1.5. 守护进程的实例 1.6. 守护进程的管理 1.7. 影响与处理 二、僵尸进程&#xff08;Zombie Process&#xff09; 2.1. 僵尸进程的定义…...

深度学习pytorch之19种优化算法(optimizer)解析

提示&#xff1a;有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法&#xff0c;包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等&#xff0c;通过对这些算法的公式和参数说明进行详细解析…...

rust笔记5-derive属性2

在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…...

介绍cherrypick

git cherry-pick 是 Git 中的一个强大命令&#xff0c;用于将一个或多个提交&#xff08;commit&#xff09;从一个分支应用到另一个分支。它允许你选择性地将特定的变更引入到当前分支&#xff0c;而无需合并整个分支。以下是对 git cherry-pick 操作的详细介绍&#xff1a; 1…...

HTTP、HTTPS区别可靠性及POST为什么比GET安全的探讨

一、简述HTTP协议 HTTP底层是TCP实现&#xff0c;TCP是一个可靠的传输层网络协议&#xff0c;但是可靠性不是安全性——可靠但不安全 1、为什么TCP可靠&#xff1f;UDP不可靠&#xff1f; 可靠指的是源和目标可以相互访问以及确保数据的传输顺序&#xff0c;我能通过IP端口访…...

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …...

AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?

AIGC的概念 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;的概念主要是指人工智能生成内容。 这是一种新的人工智能技术&#xff0c;它利用人工智能模型&#xff0c;根据给定的主题、关键词、格式、风格等条件&#xff0c;自动生成各种类型的文本、图…...

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…...

mac安装Pyspark并连接Mysql

安装Scala, apache-spark, Hadoop brew install scala brew install apache-spark brew install hadoop pip install pyspark注意不要自己另外安装jdk, 会造成版本对不上报错。因为安装apache-spark的过程中会自动安装openjdk。 配置环境变量 JAVA_HOME/opt/homebrew/Cellar…...

深入理解Python多进程编程 multiprocessing

深入理解Python多进程编程 multiprocessing flyfish Python 的 multiprocessing 模块允许创建多个进程&#xff0c;从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行&#xff0c;极大地提高了处理效率&#xff0c;特别是在…...

jQuery AJAX 方法详解

jQuery AJAX 方法详解 引言 随着互联网技术的不断发展,前端开发领域的技术也在不断更新迭代。jQuery 作为一种广泛使用的前端JavaScript库,极大地简化了DOM操作和事件处理。在众多jQuery功能中,AJAX(Asynchronous JavaScript and XML)方法尤为突出,它允许我们在不重新加…...

青少年编程都有哪些比赛可以参加

Python小学生可参加的赛事&#xff1a; 电子学会青少年编程考级、中国计算机学会编程能力等级认证、蓝桥杯、 信奥赛CSP-J/S初赛/NOIP(推荐C)、编程设计、信息素养、科技创新赛&#xff1b; 升学助力(科技特长生、大学)、企业、出国留学&#xff1b; python比赛&am…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...

无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技

无需布线的革命&#xff1a;电力载波技术赋能楼宇自控系统 在楼宇自动化领域&#xff0c;传统控制系统依赖复杂的专用通信线路&#xff0c;不仅施工成本高昂&#xff0c;后期维护和扩展也极为不便。电力载波技术&#xff08;PLC&#xff09;的突破性应用&#xff0c;彻底改变了…...