当前位置:首页 > PHP

php实现并发请求

2026-02-16 09:01:40PHP

PHP 实现并发请求的方法

使用 cURL 多线程(Multi-cURL)

cURL 的 multi_* 函数族允许同时发起多个 HTTP 请求。示例代码:

$urls = [
    'https://api.example.com/endpoint1',
    'https://api.example.com/endpoint2'
];

$mh = curl_multi_init();
$handles = [];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running);

$results = [];
foreach ($handles as $ch) {
    $results[] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
}

curl_multi_close($mh);

使用 Guzzle 异步请求

Guzzle HTTP 客户端库支持 Promise 模式的并发请求:

require 'vendor/autoload.php';

$client = new GuzzleHttp\Client();
$promises = [
    'request1' => $client->getAsync('https://api.example.com/endpoint1'),
    'request2' => $client->getAsync('https://api.example.com/endpoint2')
];

$results = GuzzleHttp\Promise\unwrap($promises);
$response1 = $results['request1']->getBody();
$response2 = $results['request2']->getBody();

使用 Swoole 协程

Swoole 扩展提供了协程支持,可实现高性能并发:

Swoole\Runtime::enableCoroutine();

go(function () {
    $http = new Swoole\Coroutine\Http\Client('api.example.com', 443, true);
    $http->get('/endpoint1');
    $result1 = $http->body;
    $http->close();
});

go(function () {
    $http = new Swoole\Coroutine\Http\Client('api.example.com', 443, true);
    $http->get('/endpoint2');
    $result2 = $http->body;
    $http->close();
});

使用进程控制(PCNTL)

通过 fork 进程实现并行处理:

$urls = ['url1', 'url2'];
$pids = [];

foreach ($urls as $url) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('Could not fork');
    } elseif ($pid) {
        $pids[] = $pid;
    } else {
        // 子进程处理
        $result = file_get_contents($url);
        exit();
    }
}

foreach ($pids as $pid) {
    pcntl_waitpid($pid, $status);
}

使用 ReactPHP 事件循环

基于事件驱动的异步编程:

$loop = React\EventLoop\Factory::create();
$client = new React\Http\Browser($loop);

$promises = [
    $client->get('https://api.example.com/endpoint1'),
    $client->get('https://api.example.com/endpoint2')
];

React\Promise\all($promises)->then(function (array $responses) {
    $response1 = $responses[0];
    $response2 = $responses[1];
});

$loop->run();

注意事项

  • cURL 多线程适用于大多数 PHP 环境,但需要启用 cURL 扩展
  • Guzzle 需要 Composer 安装,适合现代 PHP 项目
  • Swoole 性能最高但需要安装扩展
  • 进程控制方法会创建真实进程,资源消耗较大
  • 异步编程模式需要理解 Promise 和事件循环概念

选择方法时应考虑:

  • PHP 版本和环境限制
  • 并发请求的数量级
  • 对性能的特殊需求
  • 项目现有技术栈

php实现并发请求

标签: php
分享给朋友:

相关文章

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/…