webman有类似于workerman的大文件下载方案吗?

witersen

1、背景

在用webman做http接口服务,开发一款前后端分离的应用

2、描述:

要实现:用户通过接口下载文件的功能,经测试通过下面的方法的可以进行下载:

```php
<?php

namespace app\controller;

use support\Request;

Class DownloadRep{
    //下载备份文件
    public function DownloadRepBackup(Request $request)
    {
        $filePath = "...";
        return response()->download($filePath);
    }
}

3、问题

现在要实现大文件下载,可能是上百M,看到论坛有提供下面的下载方式,想请问在上述控制器的任何一个方法内能拿到$connection对象来使用吗?对文档提供的回调函数的用法不是很理解。
(或者说在webman的控制器的函数中如何使用$conection对象(即TcpConnection实例))

<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';

$worker = new Worker('http://0.0.0.0:4236');
$worker->onMessage = function($connection, $data)
{
    if($_SERVER == '/favicon.ico')
    {
        return $connection->send("HTTP/1.0 404 Not Found\r\nContent-Length: 0\r\n\r\n", true);
    }
    // 这里发送的是一个大的pdf文件,如果是其它格式的文件,请修改下面代码中http头
    send_file($connection, "/your/path/xxx.pdf");
};

function send_file($connection, $file_name)
{
    if(!is_file($file_name))
    {
        $connection->send("HTTP/1.0 404 File Not Found\r\nContent-Length: 18\r\n\r\n404 File Not Found", true);
        return;
    }

    // ======发送http头======
    $file_size = filesize($file_name);

    //省略...

    $connection->onBufferDrain = function($connection)use($do_write)
    {
        $connection->bufferFull = false;
        $do_write();
    };
    // 执行发送
    $do_write();
}
Worker::runAll();
2039 3 0
3个回答

walkor

直接用 response()->download() 就行

  • witersen 2022-05-06

    感谢解答。可是我现在无论使用 response()->download() 还是 response()->file() 还是 response()->withFile() ,前端的下载都会卡在不超过2M的时候,下载没有结束没有报错但是就是一直下载加载中,我用前端的请求方法请求另外的文件下载接口,就可以正常下载,请问是否为webman哪里的配置信息需要更改吗?

  • walkor 2022-05-06

    我这测试正常。测试代码

    <?php
    
    namespace app\controller;
    
    use support\Request;
    
    class Index
    {
        public function index(Request $request)
        {
            return response('')->download(public_path(). '/1.zip');
        }
    }

    1.zip 大概10M

    webman不支持使用使用$connection对象,不过你可以在webman里自定义进程,webman自定义进程和workerman使用起来几本没有区别

  • witersen 2022-05-06

    非常感谢walkor,我继续探索下自定义进程的用法

  • zhaohanfeng 2022-07-27

    下载文件大于2M左右就出现网络错误,在linux服务器下还是存在

  • evilk 2022-07-27

    需要更新 PHP 和 ngin 相关配置才行

  • zfxcms 2022-08-15

    能把数据流放在file()方法里面吗?因为我上传的时候加密了,得解密后把数据流发送到客户端

doit

请问有无实现方案?

  • 暂无评论
楚羽幽

老哥,你这个找到解决办法了吗? 我也是遇到了这个问题
https://www.workerman.net/q/10320

  • 暂无评论
年代过于久远,无法发表回答
🔝