0

0

Swoole怎么实现文件的异步上传和下载

冰火之心

冰火之心

发布时间:2025-09-28 15:28:01

|

200人浏览过

|

来源于php中文网

原创

Swoole通过协程与异步I/O实现高效文件上传下载。1. 上传时利用HTTP服务器接收文件,结合协程安全写入避免阻塞;2. 下载支持本地流式发送(createDownloadStream)和远程分块代理下载;3. 需启用协程、控制内存、校验文件并清理临时文件,确保安全与性能。

swoole怎么实现文件的异步上传和下载

Swoole 实现文件的异步上传和下载,核心在于利用其异步非阻塞 I/O 能力,结合 HTTP 服务器和协程特性来高效处理文件操作。以下是具体实现方式:

异步文件上传

使用 Swoole 的 HTTP 服务器接收客户端上传的文件,并通过 协程 + 异步写入避免阻塞主线程。

实现要点:

  • 开启 Swoole 的 HTTP 服务,监听 request 事件
  • 通过 $request->files 获取上传文件信息
  • 使用 Swoole\Coroutine\Filefile_put_contents(在协程上下文中自动异步)保存文件
  • 可结合临时文件、校验、重命名等逻辑

示例代码:

$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->set([
    'enable_coroutine' => true,
    'worker_num' => 2
]);

$server->on('Request', function ($request, $response) {
    if ($request->server['request_method'] == 'POST' && isset($request->files['upload'])) {
        $file = $request->files['upload'];
        $tmpPath = "/tmp/{$file['name']}";

        // 协程安全地异步写入
        $result = Swoole\Coroutine\File::write($tmpPath, file_get_contents($file['tmp_name']));

        if ($result) {
            $response->end(json_encode(['status' => 'success', 'path' => $tmpPath]));
        } else {
            $response->end(json_encode(['status' => 'fail']));
        }
    } else {
        $response->end('

            
            
        
');
    }
});

$server->start();

异步文件下载

通过 Swoole 提供大文件或远程文件的异步流式下载,避免内存溢出,提升并发能力。

赣极购物商城网店建站软件系统
赣极购物商城网店建站软件系统

大小仅1兆左右 ,足够轻便的商城系统; 易部署,上传空间即可用,安全,稳定; 容易操作,登陆后台就可设置装饰网站; 并且使用异步技术处理网站数据,表现更具美感。 前台呈现页面,兼容主流浏览器,DIV+CSS页面设计; 如果您有一定的网页设计基础,还可以进行简易的样式修改,二次开发, 发布新样式,调整网站结构,只需修改css目录中的css.css文件即可。 商城网站完全独立,网站源码随时可供您下载

下载

实现方式:

  • 使用 Http\Response -> createDownloadStream() 方法(Swoole 4.8+)直接流式发送本地文件
  • 对远程文件:使用 Swoole\Coroutine\Http\Client 异步获取内容,分块写入响应
  • 设置合适的 headers(Content-Type、Content-Length、Content-Disposition)

本地文件流式下载示例:

$server->on('Request', function ($request, $response) {
    if ($request->get['action'] == 'download') {
        $filePath = '/path/to/large-file.zip';
        if (file_exists($filePath)) {
            // 自动异步流式发送
            $response->createDownloadStream($filePath, 'custom-name.zip');
        } else {
            $response->status(404);
            $response->end('File not found');
        }
    }
});

远程文件代理下载(异步中转):

$server->on('Request', function ($request, $response) {
    if ($request->get['action'] == 'proxy-download') {
        $client = new Swoole\Coroutine\Http\Client('example.com', 443, true);
        $client->setHeaders([
            'Host' => "example.com",
            'User-Agent' => 'Mozilla/5.0'
        ]);
        $client->get('/large-file.zip');

        $response->header('Content-Type', 'application/octet-stream');
        $response->header('Content-Disposition', 'attachment; filename="remote-file.zip"');

        // 分块返回
        $buffer = $client->body;
        $response->write($buffer);
        $response->end();
        $client->close();
    }
});

关键注意事项

  • 协程环境:确保启用 enable_coroutine,否则 file 操作会阻塞
  • 内存控制:大文件不要一次性读入内存,使用 fread/fwrite 分块或 createDownloadStream
  • 安全性:上传文件需校验类型、大小、重命名,防止恶意上传
  • 临时清理:上传后及时处理 tmp 文件,避免堆积
基本上就这些。Swoole 的协程机制让异步文件处理变得简单高效,合理使用能显著提升 Web 服务性能。

相关专题

更多
swoole为什么能常驻内存
swoole为什么能常驻内存

swoole常驻内存的特性:1. 事件驱动模型减少内存消耗;2. 协程并行执行任务占用更少内存;3. 协程池预分配协程消除创建开销;4. 静态变量保留状态减少内存分配;5. 共享内存跨协程共享数据降低内存开销。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

290

2024.04.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

746

2023.08.22

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

390

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

920

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

478

2023.08.04

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号