webman其他主流框架的性能对比。测评地址:https://www.techempower.com/benchmarks/#hw=ph&test=json§ion=data-r23&l=zik073-cn3
在现代微服务架构中,结合高性能 PHP 框架与分布式对象存储能够显著提升应用的效率和可扩展性。Webman 是一款基于 Workerman 的高性能 PHP 微服务框架,以其常驻内存和异步处理能力受到广泛欢迎。
MinIO 作为一款开源、轻量、S3 兼容的分布式对象存储系统,适合各种文件存储场景。本文将详细介绍如何通过 tinywan/storage
扩展包在 Webman 中集成 MinIO,重点说明配置文件的正确设置,并提供完整代码示例。
Webman 专为微服务和 API 开发设计,具有以下特点:
MinIO 是一款高性能的分布式对象存储服务,具备以下优势:
通过结合 Webman 的高效处理能力和 MinIO 的强大存储功能,开发者可以构建高性能、可靠的文件管理微服务。
在开始集成之前,需准备以下环境:
tinywan/storage
扩展包简化 MinIO 操作。通过 Composer 创建 Webman 项目:
composer create-project workerman/webman
使用 Docker 快速部署 MinIO:
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
)。
在 Webman 项目中安装 tinywan/storage
:
composer require tinywan/storage
tinywan/storage
的配置文件位于 config/plugin/tinywan/storage/app.php
。修改 s3
部分以配置 MinIO(因为 MinIO 兼容 S3 API)。以下是配置示例:
<?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 作为默认存储。key
和 secret
:对应 MinIO 的 MINIO_ROOT_USER
和 MINIO_ROOT_PASSWORD
。bucket
:设置为 MinIO 中创建的存储桶名称。endpoint
:MinIO 服务的访问地址。domain
:文件访问的 URL 前缀,指向 MinIO 存储桶。use_path_style_endpoint
:设置为 true
,适配 MinIO 的路径风格 URL。在 app/service
目录下创建 MinIOService.php
,封装 MinIO 操作:
<?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
,实现文件上传功能:
<?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
中添加文件上传路由:
<?php
use support\Router;
Router::post('/file/upload', [app\controller\FileController::class, 'upload']);
使用 curl
测试文件上传接口:
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.php
中 s3
部分的正确配置。希望这篇教程能帮助你快速完成 Webman 与 MinIO 的集成,开发出高效的微服务应用!