当前位置:首页 > 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中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n!…

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 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…