ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hyperf 3.0 升级实战指南:迁移至 PHP 8.0 与原生 Attribute 的完整步骤

Hyperf 3.0 升级实战指南:迁移至 PHP 8.0 与原生 Attribute 的完整步骤 后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载本文以 Hyperf 官方 3.0 升级指南docs/id/upgrade/3.0.md为骨架系统梳理从 Hyperf 2.x 迁移到 3.0 的全部步骤包括 Annotation 到 PHP8 Attribute 的自动转换、组件版本批量升级、数据库模型重生成、monolog 3.x 与 Command 事件监听器的适配以及启动服务后需要逐项修正的兼容点。读完本文你将能够按清单完成一次低风险的 3.0 升级并理解每项改动背后的框架源码依据。升级前必须了解的三大核心变化Hyperf 3.0 是一次包含大量破坏性变更Breaking Change的大版本升级其核心变化可概括为三点PHP 最低版本提升至 8.03.0 要求运行环境至少为 PHP 8.0升级前请先确认线上与本地环境的 PHP 版本。彻底移除Doctrine Annotations全面采用 PHP 8 原生 Attribute所有Annotation形式的注解都改为#[Attribute]写法这是本次升级工作量最大的部分。框架为大量成员变量Member Variable补充了类型声明AMQP 的 Consumer/Producer、Async Queue 等组件的属性都加上了明确的类型业务侧继承或覆写这些类的代码需要同步适配。理解了这三点接下来的每一步操作就都有了明确的目的转换注解、提升依赖、重生成模型、补齐类型。第一步将全部注解自动转换为原生 Attribute注意此步骤只能在 Hyperf 2.2 版本下执行升级到 3.0 之后再执行将无法转换。Hyperf 官方提供了一个转换脚本可以自动将项目中所有Doctrine Annotations批量改写为 PHP 8 原生 Attributecomposer require hyperf/code-generator php bin/hyperf.php code:generate -D app其中-D指定目标目录这里是app也可以根据实际项目结构调整脚本会遍历该目录下的全部 PHP 文件并完成注解语法转换。执行完成后建议检查 git diff确认转换结果符合预期后再进入下一步。第二步批量修改 Hyperf 组件版本并更新依赖打开项目的composer.json将其中所有hyperf/*组件的版本约束统一改为3.0.*{ require: { hyperf/framework: 3.0.*, hyperf/database: 3.0.*, hyperf/amqp: 3.0.* } }两点补充说明hyperf/engine不跟随框架版本号无需修改版本约束只需保证其为^2.1.0如果你使用的是 Hyperf 3.0 以下的旧版本则 engine 组件应使用^1.5。engine 是 Hyperf 对接 Swoole/Swow 底层能力的核心组件其版本与框架主版本解耦。完成上述修改后执行composer update -o-o表示优化自动加载依赖即可正常升级。第三步重新生成数据库模型类由于 3.0 的模型基类为成员变量增加了类型支持旧版本生成的模型类需要重新生成以补充类型声明。官方提供了一键重生成脚本composer require hyperf/code-generator php vendor/bin/regenerate-models.php $PWD/app/Model该脚本会遍历app/Model目录下的模型文件并自动改写。与之相关的日常命令是php bin/hyperf.php gen:model其实现位于 ModelCommand通过 AST抽象语法树解析与重写来生成或更新模型类regenerate-models.php正是复用了这套 AST 重写机制如 ModelUpdateVisitor、ModelRewriteConnectionVisitor 等 Visitor因此升级后模型属性、连接池等配置会被自动补齐。Logger 适配兼容 monolog 3.x3.0 起monolog/monolog升级到 3.x其内部使用了 PHP 8.1 的新特性导致部分自定义日志处理器类需要特殊修改。最常见的改动是将处理器__invoke方法的参数类型array $record改为array|LogRecord $record。以下是一个在 3.0 下可正常运行的日志处理器完整示例为请求追加 request_id 与协程 ID?php declare(strict_types1); namespace App\Kernel\Log; use Hyperf\Context\Context; use Hyperf\Coroutine\Coroutine; use Monolog\LogRecord; use Monolog\Processor\ProcessorInterface; class AppendRequestIdProcessor implements ProcessorInterface { public const REQUEST_ID log.request.id; public function __invoke(array|LogRecord $record) { $record[extra][request_id] Context::getOrSet(self::REQUEST_ID, uniqid()); $record[extra][coroutine_id] Coroutine::id(); return $record; } }注意示例中Context已使用新的命名空间Hyperf\Context\Context详见下文第五步的全局替换。Command 事件监听导致进程无法退出的问题与两种解决方案3.0 之后命令行Command默认启用事件监听器。如果你的监听器监听了Command相关事件并在其中执行了类似AMQP消费这类多路复用Multiplexing逻辑那么命令执行完毕后进程将因事件循环仍在运行而无法正常退出。官方给出两种解决方案方案一执行命令时禁用事件分发器在运行命令时追加--disable-event-dispatcher选项php bin/hyperf.php your:command --disable-event-dispatcher该选项的实现位于 DisableEventDispatcher traitaddDisableDispatcherOption()为所有命令注册该选项disableDispatcher()在命令执行前判断——一旦指定该选项就不会从容器中取出事件分发器注入命令从而跳过事件分发。相关逻辑可见 Command::execute()命令的核心逻辑在协程中执行并在finally中分发AfterExecute事件、调用CoordinatorManager::until(Constants::WORKER_EXIT)-resume()通知工作进程退出。方案二注册监听器主动恢复退出协调器如果业务确实需要在命令事件中执行 AMQP 等多路复用逻辑可以注册如下监听器在命令执行完毕后主动恢复WORKER_EXIT协调器让进程正常退出?php declare(strict_types1); namespace App\Listener; use Hyperf\Command\Event\AfterExecute; use Hyperf\Coordinator\Constants; use Hyperf\Coordinator\CoordinatorManager; use Hyperf\Event\Annotation\Listener; use Hyperf\Event\Contract\ListenerInterface; #[Listener] class ResumeExitCoordinatorListener implements ListenerInterface { public function listen(): array { return [ AfterExecute::class, ]; } public function process(object $event): void { CoordinatorManager::until(Constants::WORKER_EXIT)-resume(); } }事件类AfterExecute位于 src/command/src/Event/AfterExecute.php它携带Command实例与可选的Throwable在命令逻辑执行完毕含异常路径后由 Command::execute() 在finally块中分发。Constants::WORKER_EXIT定义于 src/coordinator/src/Constants.php值为workerExit对应 Swoole 的onWorkerExit生命周期CoordinatorManager::until()会阻塞等待该事件被resume()从而保证主进程在 AMQP 等长连接资源释放后再退出。两种方式按需选择仅执行普通命令时推荐方案一更简单命令中确需运行常驻型多路复用逻辑时使用方案二。全局替换 Hyperf\Utils\Context 命名空间3.0 中Context类的命名空间发生了变化必须全局执行字符串替换Hyperf\Utils\Context Hyperf\Context\Context除Context外3.0 还对一批工具类命名空间做了收敛例如Hyperf\Utils\*拆分为Hyperf\Collection、Hyperf\Stringable、Hyperf\Support等建议在替换后借助 IDE 的全局搜索逐一核对use语句。上文 Logger 示例中的use Hyperf\Context\Context;即对应此变更。启动服务逐项核对剩余兼容点完成上述步骤后即可启动服务php bin/hyperf.php start运行过程中会暴露出尚未适配的代码请按以下清单逐项修正AMQPConsumer 与 Producer 的成员变量已添加类型声明继承它们的业务类需要同步补充或匹配类型。Listenerprocess方法新增了void返回类型自定义监听器必须改为public function process(object $event): void。CircuitBreaker注解#[CircuitBreaker]的参数$timeout变更为$options.timeout。查看 CircuitBreaker 注解源码 可见3.0 中构造参数为public array $options []超时时间需通过options数组传入注释示例为[timeout 1]旧版直接传timeout的写法需要改写为#[CircuitBreaker(options: [timeout 1])] public function request() { // ... }Async Queue队列消费者的成员变量已添加类型同时事件对象中的event-message字段改为非 public 属性必须通过event-getMessage()读取。gRPCHTTP 状态码固定为 200 的行为变更按照 gRPC 协议规范3.0 起gRPC Server 返回的 HTTP 状态码固定为 200错误信息通过 gRPC 自身的status code传达而不再依赖 HTTP 状态码。这一变更是破坏性的如果你在升级前就使用 gRPC务必同步将相关服务升级到 3.x否则当请求发生异常时对端旧版本客户端无法正常解析错误。升级后建议针对 gRPC 调用补充异常路径的联调测试确认服务端异常时客户端能够正确读取 gRPC status code 与错误详情。升级检查清单确认 PHP 版本 ≥ 8.0且运行环境支持 PHP 8 原生 Attribute在 2.2 环境下执行code:generate完成注解转换composer.json中所有hyperf/*改为3.0.*engine 保持^2.1.0旧版本用^1.5执行composer update -o通过regenerate-models.php重新生成app/Model下的模型类日志处理器参数改为array|LogRecord适配 monolog 3.x按需为命令追加--disable-event-dispatcher或注册ResumeExitCoordinatorListener全局替换Hyperf\Utils\Context为Hyperf\Context\Context启动服务逐项修正 AMQP 属性类型、Listenervoid返回、CircuitBreakeroptions参数、Async Queue 的getMessage()读取方式gRPC 相关服务同步升级至 3.x 并验证异常路径。按此清单推进即可将 Hyperf 2.x 项目平滑迁移至 3.0并充分享受 PHP 8 原生 Attribute 与严格类型带来的可维护性提升。赞分享后端Web框架微服务RPC框架异步编程【免费下载链接】hyperf A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.项目地址https://gitcode.com/hyperf/hyperf点击查看免费下载相关推荐Hyperf 3.0 升级指南PHP 8 原生 Attribute 迁移与破坏性变更全解析Hyperf 3.0 升级指南PHP 8 原生 Attribute 迁移与破坏性变更全解析 本篇指南以官方 3.0 升级文档 docs/en/upgrade后端Web框架微服务RPC框架异步编程Hyperf 3.0 版本升级全指南PHP 8 原生 Attribute 迁移、破坏性变更与新增能力详解Hyperf 3.0 版本升级全指南PHP 8 原生 Attribute 迁移、破坏性变更与新增能力详解 本文以 Hyperf 3.0 系列发布日志 doc后端Web框架微服务RPC框架异步编程Hyperf 3.0 升级指南Annotations 迁移、PHP 8 类型约束与兼容性适配完整实践Hyperf 3.0 升级指南Annotations 迁移、PHP 8 类型约束与兼容性适配完整实践 本指南基于 Hyperf 官方升级文档 docs/id/后端微服务上一篇零延迟实践Web-LLM服务工作线程模型加载与推理全解析下一篇如何在Fumadocs中实现高效的国际化MDX路由优化方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表