Hyperf Nano:用单个 PHP 文件零配置构建 Hyperf 应用
发布时间:2026/10/8 23:40:18 锦皓数字建站

后端微服务【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/gh_mirrors/hy/hyperf点击查看免费下载hyperf/nano是 Hyperf 生态中的一款极简发行版它把完整的 Hyperf 框架压缩到单个 PHP 文件即可运行无需骨架工程、无需任何配置文件。本文基于 docs/en/nano.md 系统讲解 Nano 的安装、快速上手、路由、依赖注入、中间件、异常处理、自定义命令、事件监听、自定义进程、定时任务以及 Hyperf 组件的接入方式并对照本仓库源码说明其底层原理帮助你在微服务脚手架、内部工具、演示原型、Phar 分发等场景中用最少的代码快速落地一个可运行的 Hyperf 服务。Nano 是什么Hyperf 官方仓库在 README.md 中将 Nano 定位为A zero-config, no skeleton, minimal Hyperf distribution that allows you to quickly build a Hyperf application with just a single PHP file.即一个零配置、无骨架、极简的 Hyperf 发行版一个 PHP 文件即可构建完整应用。在文档目录 docs/en/summary.md 的 Hyperf Ecosystem 一节中Nano 被列为与 GoTask、Box 并列的生态组件足见其定位它不是替代 Hyperf而是 Hyperf 的轻量入口。Nano 的核心特性如下无骨架No skeleton不需要config/、app/、routes/等目录结构不需要脚手架初始化快速启动Fast startup省去了骨架扫描、配置加载、注解解析等启动开销进程拉起更快零配置Zero config无需任何配置文件即可启动 HTTP 服务闭包风格Closure style路由、中间件、异常处理器等全部可以用闭包定义支持注解外的全部 Hyperf 功能DI、AOP、事件、进程、定时任务、组件等全部可用唯一例外是注解Annotations——因为 Nano 没有类扫描与注解解析阶段兼容全部 Hyperf 组件hyperf/db、hyperf/redis、hyperf/async-queue等均可直接使用Phar 友好Phar friendly见 docs/zh-cn/nano.md由于应用只有一个入口文件非常适合打包为 Phar 单文件分发。安装与环境要求通过 Composer 安装即可等价于把 Nano 当作一个普通依赖引入项目composer require hyperf/nano安装后项目根目录只需一个入口文件通常命名为index.php并通过vendor/autoload.php加载依赖即可。运行环境与 Hyperf 一致本仓库根 composer.json 声明 Hyperf 框架本身要求php 8.2、ext-swoole 5.0等扩展Nano 应用同样运行在 Swoole/Swow 协程运行时之上请确保环境满足相应的 PHP 版本与 Swoole 扩展要求。快速开始第一个 Hello World在项目根目录创建index.php?php // index.php use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(0.0.0.0, 9051); $app-get(/, function () { $user $this-request-input(user, nano); $method $this-request-getMethod(); return [ message hello {$user}, method $method, ]; }); $app-run();启动服务php index.php start没错仅此而已。AppFactory::create()的两个参数分别指定监听地址0.0.0.0与端口9051均可省略。启动后访问http://127.0.0.1:9051/?userhyperf即可得到 JSON 响应其中包含message问候语与method当前 HTTP 方法两个字段。细心的读者会发现路由闭包中直接使用了$this-request。这是 Nano 的一个关键约定在所有由 Nano 管理的闭包路由、中间件、异常处理器等中$this都被绑定到了Hyperf\Nano\ContainerProxy上因此你可以像在控制器中一样通过$this-request拿到当前请求对象、通过$this-get()从容器中取依赖。路由继承 Hyperf 路由器的全部方法Nano 的$app对象集成了 Hyperf 路由器的所有方法包括addRoute()、addGroup()以及get()、post()、put()、delete()等 HTTP 方法别名。示例?php use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-addGroup(/nano, function () use ($app) { $app-addRoute([GET, POST], /{id:\d}, function($id) { return /nano/.$id; }); $app-put(/{name:.}, function($name) { return /nano/.$name; }); }); $app-run();上述代码注册了一个/nano前缀的路由组组内GET/POST方法匹配/nano/{id}id限定为纯数字PUT方法匹配/nano/{name}name匹配任意字符。路由参数会作为闭包的实参传入返回值即为响应内容。这些路由方法与底层实现一一对应在本仓库 src/http-server/src/Router/RouteCollector.php 中可以找到addRoute()、addGroup()的真实实现以及get()、post()、put()等别名方法——它们本质都是对addRoute()的封装例如get()即addRoute(GET, $route, $handler)。路由最终由 DispatcherFactory 注册到基于 FastRoute 的路由分发器中Nano 只是把这套成熟的 HTTP 路由能力以闭包形式暴露出来。DI 容器向容器注册与取用依赖Nano 背后运行的是 Hyperf 完整的依赖注入容器你可以通过$app-getContainer()拿到它并主动注册对象?php use Hyperf\Nano\ContainerProxy; use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; class Foo { public function bar() { return bar; } } $app AppFactory::create(); $app-getContainer()-set(Foo::class, new Foo()); $app-get(/, function () { /** var ContainerProxy $this */ $foo $this-get(Foo::class); return $foo-bar(); }); $app-run();这里先用getContainer()-set()把Foo实例注册进容器随后在路由闭包中通过$this-get(Foo::class)取出并调用其方法。ContainerProxy本质上是对 Hyperf DI 容器的代理将get()、has()等容器能力透传给闭包上下文因此你可以在任意 Nano 管理的闭包中直接解耦地获取服务。约定在 Nano 管理的所有闭包回调包括中间件、异常处理器等中$this都被绑定到ContainerProxy上。中间件Nano 通过addMiddleware()注册中间件闭包签名与 PSR-15 中间件一致接收$request与$handler?php use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-get(/, function () { return $this-request-getAttribute(key); }); $app-addMiddleware(function ($request, $handler) { $request $request-withAttribute(key, value); return $handler-handle($request); }); $app-run();中间件先通过withAttribute(key, value)向请求注入属性再调用$handler-handle($request)将请求交给后续管线路由闭包内通过$this-request-getAttribute(key)即可读到该属性并返回value。除了闭包之外所有$app-addXXX()方法如addMiddleware、addListener、addProcess、addExceptionHandler等也接受类名作为参数——你可以直接传入对应的 Hyperf 类例如一个实现了中间件接口的类。异常处理器通过addExceptionHandler()用闭包自定义异常响应签名接收$throwable抛出的异常与$response当前响应对象?php use Hyperf\HttpMessage\Stream\SwooleStream; use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-get(/, function () { throw new \Exception(); }); $app-addExceptionHandler(function ($throwable, $response) { return $response-withStatus(418) -withBody(new SwooleStream(I\m a teapot)); }); $app-run();访问/时路由闭包抛出异常Nano 的异常处理器接管并返回 HTTP418Im a teapot状态码与自定义响应体。这里使用的Hyperf\HttpMessage\Stream\SwooleStream正是本仓库 src/http-message/src 提供的 Swoole 流实现说明 Nano 与 Hyperf 的消息对象体系完全打通。自定义命令行用addCommand()注册命令命令名称作为第一个参数闭包内可通过$this-get()获取日志等依赖?php use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-addCommand(echo, function(){ $this-get(StdoutLoggerInterface::class)-info(A new command called echo!); }); $app-run();执行该命令php index.php echoStdoutLoggerInterface是 Hyperf 定义在 src/contract/src 的日志契约Nano 中直接通过容器获取其实现并输出日志。Nano 应用本身以命令php index.php start形式启动因此自定义命令与启动命令共享同一套命令行入口无需额外的命令行框架配置。事件监听用addListener()注册事件监听器第一个参数是事件类如框架启动事件BootApplication第二个参数为回调?php use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Framework\Event\BootApplication; use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-addListener(BootApplication::class, function($event){ $this-get(StdoutLoggerInterface::class)-info(App started); }); $app-run();应用启动完成后Hyperf\Framework\Event\BootApplication事件定义于本仓库 src/framework/src被触发监听器打印App started。这说明 Nano 完整保留了 Hyperf 的生命周期事件机制只是把监听器注册从注解 扫描换成了闭包 显式注册。自定义进程用addProcess()注册常驻自定义进程闭包内的while (true)循环即进程主体?php use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-addProcess(function(){ while (true) { sleep(1); $this-get(StdoutLoggerInterface::class)-info(Processing...); } }); $app-run();应用启动后该进程与 HTTP 服务并行运行每秒打印一次Processing...。Nano 复用 Hyperf 的进程管理能力对应本仓库 src/process/src 的进程模型适合在单文件应用中承载消费者、守护任务等后台逻辑。定时任务用addCrontab()注册定时任务第一个参数为标准 6 段 crontab 表达式秒 分 时 日 月 周?php use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-addCrontab(* * * * * *, function(){ $this-get(StdoutLoggerInterface::class)-info(execute every second!); }); $app-run();表达式* * * * * *表示每秒执行一次闭包每秒打印一条日志。Nano 将 Hyperf 的定时任务调度器见本仓库 src/crontab/src以最简接口暴露一条表达式、一个闭包即完成一个定时任务。使用 Hyperf 组件以数据库为例Nano 兼容全部 Hyperf 组件。使用组件时只需用$app-config()写入对应配置键配置键与 Hyperf 常规应用的配置结构一致组件即可正常工作。以hyperf/db本仓库 src/db/src为例?php use Hyperf\DB\DB; use Hyperf\Nano\Factory\AppFactory; require_once __DIR__ . /vendor/autoload.php; $app AppFactory::create(); $app-config([ db.default [ host env(DB_HOST, localhost), port env(DB_PORT, 3306), database env(DB_DATABASE, hyperf), username env(DB_USERNAME, root), password env(DB_PASSWORD, ), ] ]); $app-get(/, function(){ return DB::query(SELECT * FROM user WHERE gender ?;, [1]); }); $app-run();$app-config()接受一个以配置键 配置值构成的数组db.default下的host、port、database、username、password即为hyperf/db组件的默认连接参数均可通过env()从环境变量覆盖。随后在路由闭包中即可直接调用DB::query()执行参数化 SQL?占位符配合参数数组避免拼接注入。这展示了 Nano 的扩展路径任何 Hyperf 组件都可以配置 调用两步接入例如 Redis、异步队列、AMQP、gRPC 客户端等均可参照此模式集成。设计约定与原理小结综观全部示例可以提炼出 Nano 的几个核心设计约定单文件即应用AppFactory::create()创建应用实例$app-run()启动所有能力通过$app上的方法显式注册不存在隐式的目录扫描与注解解析闭包即处理器路由、中间件、异常处理器、命令、监听器、进程、定时任务全部接受闭包addXXX()系列方法同时兼容类名参数$this即容器代理所有闭包内$this均为Hyperf\Nano\ContainerProxy可访问$this-request、$this-response等请求上下文对象也可通过$this-get()解耦获取任意容器依赖配置即组件开关$app-config()以 Hyperf 原生配置键写入配置使全部 Hyperf 组件保持开箱即用唯一例外是注解由于缺少注解解析与类扫描阶段依赖注解如#[Controller]、#[Inject]声明式定义的特性无法使用一切均以显式闭包/类名方式声明。正因为这些约定Nano 特别适合快速原型、单文件工具服务、脚本式微服务、以及需要打包为 Phar 单文件分发的场景——在保留 Hyperf 协程性能与组件生态的同时把使用门槛降到最低。延伸阅读本仓库中的官方文档原文docs/en/nano.md、docs/zh-cn/nano.mdNano 生态定位说明README.md、docs/en/summary.md路由底层实现src/http-server/src/Router/RouteCollector.php、src/http-server/src/Router/DispatcherFactory.php组件能力相关源码src/db/src简单数据库、src/contract/src契约接口、src/framework/src生命周期事件、src/http-message/src消息对象、src/crontab/src定时任务框架环境要求composer.json赞分享后端微服务【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/gh_mirrors/hy/hyperf点击查看免费下载相关推荐Hyperf Nano 极简框架实战单文件、零配置、闭包风格快速构建 Hyperf 应用Hyperf Nano 极简框架实战单文件、零配置、闭包风格快速构建 Hyperf 应用 本文围绕 Hyperf 官方生态中的 hyperf/nano 组件展后端Web框架微服务RPC框架异步编程Hyperf入门教程从零开始构建第一个Hyperf应用Hyperf入门教程从零开始构建第一个Hyperf应用 引言为什么选择Hyperf 还在为PHP应用的性能瓶颈而烦恼吗还在为传统PHP FPM架构的高并后端Web框架微服务RPC框架异步编程Hyperf极速入门10分钟构建百万级并发PHP应用还在为PHP应用性能瓶颈而头疼传统PHP FPM架构难以支撑高并发场景Hyperf为您带来革命性的协程解决方案本文将带您快速上手这个高性能PHP框架让您后端微服务上一篇es-toolkit 函数式编程 takeRight 详解用 pipe 从数组末尾安全取值下一篇Dagger TypeScript SDK 的 CurrentModuleGeneratorsOpts 类型指南按模式筛选模块生成器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。