• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: Error | 发布时间: 2025-6-14 13:13| 查看数: 100| 评论数: 0|帖子模式

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

    1. 使用 cURL 的多线程功能

    PHP 的 cURL 扩展支持多线程处理,可以通过 curl_multi_* 系列函数实现并行 HTTP 请求。
    示例代码:
    1. $urls = [
    2.     'https://example.com/api/1',
    3.     'https://example.com/api/2',
    4.     'https://example.com/api/3',
    5. ];

    6. $mh = curl_multi_init(); // 初始化多线程 cURL
    7. $handles = [];

    8. foreach ($urls as $url) {
    9.     $ch = curl_init();
    10.     curl_setopt($ch, CURLOPT_URL, $url);
    11.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    12.     curl_multi_add_handle($mh, $ch); // 将单个 cURL 句柄添加到多线程中
    13.     $handles[] = $ch;
    14. }

    15. $running = null;
    16. do {
    17.     curl_multi_exec($mh, $running); // 执行并行请求
    18.     curl_multi_select($mh); // 等待活动
    19. } while ($running > 0);

    20. $responses = [];
    21. foreach ($handles as $ch) {
    22.     $responses[] = curl_multi_getcontent($ch); // 获取每个请求的响应
    23.     curl_multi_remove_handle($mh, $ch); // 移除句柄
    24.     curl_close($ch);
    25. }

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

    27. print_r($responses);
    复制代码
    优点:

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

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

    2. 使用 Guzzle 异步客户端

    Guzzle 是一个流行的 PHP HTTP 客户端库,支持异步请求。
    示例代码:
    1. require 'vendor/autoload.php';

    2. use GuzzleHttp\Client;
    3. use GuzzleHttp\Promise;

    4. $client = new Client();

    5. $urls = [
    6.     'https://example.com/api/1',
    7.     'https://example.com/api/2',
    8.     'https://example.com/api/3',
    9. ];

    10. $promises = [];
    11. foreach ($urls as $url) {
    12.     $promises[] = $client->getAsync($url); // 发起异步请求
    13. }

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

    15. foreach ($responses as $response) {
    16.     if ($response['state'] === 'fulfilled') {
    17.         echo $response['value']->getBody() . "\n"; // 输出响应内容
    18.     } else {
    19.         echo 'Request failed: ' . $response['reason']->getMessage() . "\n";
    20.     }
    21. }
    复制代码
    优点:

    • 代码简洁,易于使用。
    • 支持并发请求和异步处理。
    缺点:
    需要安装 Guzzle 库。

    3. 使用 Swoole 扩展

    Swoole 是一个高性能的 PHP 扩展,支持异步、协程和并行处理。
    示例代码:
    1. Swoole\Runtime::enableCoroutine(); // 启用协程

    2. $urls = [
    3.     'https://example.com/api/1',
    4.     'https://example.com/api/2',
    5.     'https://example.com/api/3',
    6. ];

    7. $responses = [];

    8. go(function () use ($urls, &$responses) {
    9.     $client = new Swoole\Coroutine\Http\Client('example.com', 443, true);
    10.     foreach ($urls as $url) {
    11.         $client->get($url);
    12.         $responses[] = $client->body;
    13.     }
    14. });

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

    16. print_r($responses);
    复制代码
    优点:

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

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

    4. 使用 ReactPHP

    ReactPHP 是一个基于事件驱动的 PHP 库,支持异步编程。
    示例代码:
    1. require 'vendor/autoload.php';

    2. use React\EventLoop\Factory;
    3. use React\HttpClient\Client;
    4. use React\HttpClient\Response;

    5. $loop = Factory::create();
    6. $client = new Client($loop);

    7. $urls = [
    8.     'https://example.com/api/1',
    9.     'https://example.com/api/2',
    10.     'https://example.com/api/3',
    11. ];

    12. foreach ($urls as $url) {
    13.     $request = $client->request('GET', $url);
    14.     $request->on('response', function (Response $response) {
    15.         $response->on('data', function ($chunk) {
    16.             echo $chunk;
    17.         });
    18.     });
    19.     $request->end();
    20. }

    21. $loop->run();
    复制代码
    优点:

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

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

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

    PHP 的 pcntl 扩展支持多进程编程,可以通过创建子进程来实现并行处理。
    示例代码:
    1. $urls = [
    2.     'https://example.com/api/1',
    3.     'https://example.com/api/2',
    4.     'https://example.com/api/3',
    5. ];

    6. $children = [];

    7. foreach ($urls as $url) {
    8.     $pid = pcntl_fork();
    9.     if ($pid == -1) {
    10.         die('Could not fork');
    11.     } elseif ($pid) {
    12.         $children[] = $pid; // 父进程记录子进程 ID
    13.     } else {
    14.         // 子进程处理请求
    15.         echo file_get_contents($url) . "\n";
    16.         exit(); // 子进程退出
    17.     }
    18. }

    19. // 父进程等待所有子进程完成
    20. foreach ($children as $pid) {
    21.     pcntl_waitpid($pid, $status);
    22. }
    复制代码
    优点:

    • 真正的并行处理。
    • 适合 CPU 密集型任务。
    缺点:

    • 需要 pcntl 扩展。
    • 进程间通信复杂。

    总结

    cURL 多线程:适合简单的并行 HTTP 请求。
    Guzzle:代码简洁,适合大多数场景。
    Swoole:高性能,适合高并发场景。
    ReactPHP:基于事件驱动,适合异步编程。
    多进程:适合 CPU 密集型任务,但复杂度较高。
    根据具体需求选择合适的方法即可。
    以上就是浅析PHP如何并行异步处理HTTP请求的详细内容,更多关于PHP异步处理HTTP请求的资料请关注脚本之家其它相关文章!

    来源:https://www.jb51.net/program/336395oc1.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表