当前位置:首页 > 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 模式的并发请求:

php实现并发请求

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 进程实现并行处理:

php实现并发请求

$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实现栈

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

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php 实现跳转

php 实现跳转

PHP 实现页面跳转的方法 在PHP中,实现页面跳转可以通过多种方式完成,以下是几种常用的方法: 使用header函数 header函数是PHP中最常用的跳转方法,通过发送HTTP头部信息实现跳转。…