当前位置:首页 > PHP

php实现http异步

2026-02-15 20:24:21PHP

使用 cURL 多线程实现异步

在 PHP 中,可以通过 cURL 的多线程功能实现 HTTP 异步请求。这种方法适用于需要同时发起多个 HTTP 请求的场景。

$urls = [
    'http://example.com/api1',
    'http://example.com/api2',
    'http://example.com/api3'
];

$mh = curl_multi_init();
$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);
    $handles[] = $ch;
}

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

foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    // 处理响应
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);

使用 Guzzle 异步客户端

Guzzle 是一个流行的 PHP HTTP 客户端,它提供了简洁的异步请求接口。

php实现http异步

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client();
$promises = [
    'example1' => $client->getAsync('http://example.com/api1'),
    'example2' => $client->getAsync('http://example.com/api2'),
    'example3' => $client->getAsync('http://example.com/api3')
];

$results = Promise\Utils::settle($promises)->wait();

foreach ($results as $key => $result) {
    if ($result['state'] === 'fulfilled') {
        $response = $result['value'];
        // 处理成功响应
    } else {
        $reason = $result['reason'];
        // 处理错误
    }
}

使用 ReactPHP 实现非阻塞 HTTP 请求

ReactPHP 是一个低级别的异步编程库,适合需要更精细控制异步流程的场景。

php实现http异步

require 'vendor/autoload.php';

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

$client->get('http://example.com/api')->then(
    function (Psr\Http\Message\ResponseInterface $response) {
        // 处理成功响应
    },
    function (Exception $e) {
        // 处理错误
    }
);

$loop->run();

使用 Swoole 协程实现高性能异步

Swoole 是一个 PHP 协程框架,提供了高性能的异步 HTTP 客户端。

Swoole\Runtime::enableCoroutine();

go(function () {
    $client = new Swoole\Coroutine\Http\Client('example.com', 80);
    $client->get('/api');

    if ($client->statusCode === 200) {
        // 处理响应
    }

    $client->close();
});

使用消息队列实现后台处理

对于不需要立即获取结果的场景,可以通过消息队列将 HTTP 请求任务放入后台处理。

// 生产者代码
$queue = new Redis();
$queue->connect('127.0.0.1', 6379);
$queue->lPush('http_requests', json_encode([
    'url' => 'http://example.com/api',
    'method' => 'GET',
    'data' => []
]));

// 消费者代码(后台 worker)
while ($task = $queue->rPop('http_requests')) {
    $task = json_decode($task, true);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $task['url']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    // 处理响应
}

每种方法适用于不同的场景,cURL 多线程适合简单的并行请求,Guzzle 提供了更高级的接口,ReactPHP 和 Swoole 适合需要长期运行的异步应用,消息队列适合后台任务处理。

标签: phphttp
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现socket

php实现socket

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

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…