首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Webman 微服务集成 MinIO 分布式对象存储

Webman 微服务集成 MinIO 分布式对象存储

作者头像
Tinywan
发布2025-09-11 19:28:21
发布2025-09-11 19:28:21
10200
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

webman其他主流框架的性能对比。测评地址:https://www.techempower.com/benchmarks/#hw=ph&test=json&section=data-r23&l=zik073-cn3

概述

在现代微服务架构中,结合高性能 PHP 框架与分布式对象存储能够显著提升应用的效率和可扩展性。Webman 是一款基于 Workerman 的高性能 PHP 微服务框架,以其常驻内存和异步处理能力受到广泛欢迎。

MinIO 作为一款开源、轻量、S3 兼容的分布式对象存储系统,适合各种文件存储场景。本文将详细介绍如何通过 tinywan/storage 扩展包在 Webman 中集成 MinIO,重点说明配置文件的正确设置,并提供完整代码示例。

为什么选择 Webman 和 MinIO?

Webman 核心优势

Webman 专为微服务和 API 开发设计,具有以下特点:

  • 常驻内存:避免传统 PHP-FPM 的重复加载,提升响应速度。
  • 高并发处理:支持异步机制,适合高流量场景。
  • 轻量高效:资源占用低,开发和部署快速。

MinIO 独特特性

MinIO 是一款高性能的分布式对象存储服务,具备以下优势:

  • 高吞吐量:支持大规模文件存储,性能优异。
  • S3 兼容性:与 AWS S3 API 完全兼容,便于集成。
  • 分布式支持:多节点部署确保高可用性和数据冗余。
  • 轻量部署:通过 Docker 快速搭建,适合容器化环境。

通过结合 Webman 的高效处理能力和 MinIO 的强大存储功能,开发者可以构建高性能、可靠的文件管理微服务。

环境准备

在开始集成之前,需准备以下环境:

  1. 1. PHP 环境:PHP 7.4 或更高版本,安装 Webman 框架。
  2. 2. MinIO 服务:通过 Docker 或二进制文件部署 MinIO。
  3. 3. 依赖库:使用 tinywan/storage 扩展包简化 MinIO 操作。

安装 Webman

通过 Composer 创建 Webman 项目:

代码语言:javascript
代码运行次数:0
运行
复制
composer create-project workerman/webman

部署 MinIO

使用 Docker 快速部署 MinIO:

代码语言:javascript
代码运行次数:0
运行
复制
docker run -d -p 9000:9000 -p 9001:9001 \
  --name minio \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=admin1234" \
  minio/minio server /data --console-address ":9001"

部署完成后,访问 http://localhost:9001,使用 admin / admin1234 登录 MinIO 控制台,创建存储桶(如 my-bucket)。

安装 tinywan/storage

在 Webman 项目中安装 tinywan/storage

代码语言:javascript
代码运行次数:0
运行
复制
composer require tinywan/storage

Webman 集成 MinIO

配置 MinIO

tinywan/storage 的配置文件位于 config/plugin/tinywan/storage/app.php。修改 s3 部分以配置 MinIO(因为 MinIO 兼容 S3 API)。以下是配置示例:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
/**
 * @desc MinIO 配置 for tinywan/storage
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/3/10 19:46
 */
return [
    'enable' => true,
    'storage' => [
        'default' => 's3', // 设置默认存储为 s3
        'single_limit' => 1024 * 1024 * 200, // 单个文件大小限制,200MB
        'total_limit' => 1024 * 1024 * 200, // 总文件大小限制,200MB
        'nums' => 10, // 文件数量限制
        'include' => [], // 允许的文件类型
        'exclude' => [], // 不允许的文件类型
        's3' => [
            'adapter' => \Tinywan\Storage\Adapter\S3Adapter::class,
            'key' => 'admin',
            'secret' => 'admin1234',
            'bucket' => 'my-bucket',
            'dirname' => 'storage',
            'domain' => 'http://127.0.0.1:9000/my-bucket',
            'region' => 'us-east-1',
            'version' => 'latest',
            'use_path_style_endpoint' => true,
            'endpoint' => 'http://127.0.0.1:9000',
            'acl' => 'public-read',
        ],
    ],
];

配置说明

  • default:设置为 s3,表示使用 MinIO 作为默认存储。
  • keysecret:对应 MinIO 的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD
  • bucket:设置为 MinIO 中创建的存储桶名称。
  • endpoint:MinIO 服务的访问地址。
  • domain:文件访问的 URL 前缀,指向 MinIO 存储桶。
  • use_path_style_endpoint:设置为 true,适配 MinIO 的路径风格 URL。

创建 MinIO 服务类

app/service 目录下创建 MinIOService.php,封装 MinIO 操作:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
namespace app\service;

use Tinywan\Storage\Storage;

class MinIOService
{
    protected$storage;

    publicfunction __construct()
    {
        $this->storage = Storage::disk('s3');
    }

    /**
     * 上传文件到 MinIO
     * @param string $filePath 本地文件路径
     * @param string $key 存储路径
     * @return string|bool 文件 URL 或 false
     */
    publicfunction uploadFile($filePath, $key)
    {
        try {
            $result = $this->storage->put($key, file_get_contents($filePath), 'public-read');
            return$result ? $this->storage->url($key) : false;
        } catch (\Exception$e) {
            returnfalse;
        }
    }

    /**
     * 获取文件预签名 URL
     * @param string $key 文件路径
     * @return string|bool 预签名 URL 或 false
     */
    publicfunction getFileUrl($key)
    {
        try {
            return$this->storage->temporaryUrl($key, now()->addMinutes(20));
        } catch (\Exception$e) {
            returnfalse;
        }
    }
}

实现文件上传接口

app/controller 目录下创建 FileController.php,实现文件上传功能:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
namespaceapp\controller;

use app\service\MinIOService;
use support\Request;

class FileController
{
    /**
     * 文件上传接口
     * @param Request $request
     * @return \support\Response
     */
    publicfunction upload(Request $request)
    {
        $file = $request->file('file');
        if (!$file || !$file->isValid()) {
            returnresponse()->json(['error' => 'Invalid file'], 400);
        }

        $minio = new MinIOService();
        $key = 'uploads/' . time() . '_' . $file->getClientOriginalName();
        $filePath = $file->getPathname();
        $url = $minio->uploadFile($filePath, $key);

        if ($url) {
            return response()->json(['url' => $url]);
        }
        return response()->json(['error' => 'Upload failed'], 500);
    }
}

配置路由

config/route.php 中添加文件上传路由:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
use support\Router;

Router::post('/file/upload', [app\controller\FileController::class, 'upload']);

测试上传

使用 curl 测试文件上传接口:

代码语言:javascript
代码运行次数:0
运行
复制
curl -X POST http://127.0.0.1:8787/file/upload -F "file=@/path/to/your/file.jpg"

成功上传后,接口返回文件的访问 URL。

小结

通过 tinywan/storage 扩展包,Webman 可以高效集成 MinIO,构建高性能的文件管理微服务。本文详细介绍了从环境搭建到代码实现的完整流程,特别强调了 config/plugin/tinywan/storage/app.phps3 部分的正确配置。希望这篇教程能帮助你快速完成 Webman 与 MinIO 的集成,开发出高效的微服务应用!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 为什么选择 Webman 和 MinIO?
    • Webman 核心优势
    • MinIO 独特特性
  • 环境准备
    • 安装 Webman
    • 部署 MinIO
    • 安装 tinywan/storage
  • Webman 集成 MinIO
    • 配置 MinIO
    • 创建 MinIO 服务类
    • 实现文件上传接口
    • 配置路由
    • 测试上传
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档