☰
Hyperf 2.0 系列版本更新深度解读:AOP 机制重构、协程服务与全组件能力演进
2026/10/9 5:08:26 网站建设 项目流程
  • 后端
  • 微服务

【免费下载链接】hyperf

🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.

项目地址:https://gitcode.com/gh_mirrors/hy/hyperf
点击查看免费下载

本文基于当前仓库中的官方版本更新记录(docs/zh-hk/changelog/2.0.md),系统梳理 Hyperf 2.0 主版本的核心架构升级与 2.0.1~2.0.25 共 25 个补丁版本的演进脉络。你将掌握:2.0 版本在依赖注入(DI)与 AOP 机制上的重构原理(为何可以切入new关键字实例化的类、为何可以代理 Final 类、代理类缓存如何随源码自动更新)、协程风格服务(Coroutine Server)带来的运行模式变化,以及phar、signal、reactive-x、nacos、scout、jet等新组件的引入时机与升级 2.0 时必须注意的破坏性变更清单。

Hyperf 2.0 发布于 2020 年 6 月 22 日,是 Hyperf 发展历程中一次以「依赖注入与 AOP 机制全面重构」为核心的重大版本。与 1.x 相比,2.0 不仅在框架底层彻底重写了注解与切面的加载机制,还同步引入了协程风格服务、热更新、Phar 打包、响应式编程、服务治理配置中心等一批新组件。本文以官方 changelog 为骨架,结合当前仓库中对应源码,逐层拆解这次升级的技术细节与实战影响。

一、2.0 版本发布概况与演进时间线

2.0 主版本发布后,官方以每周一个补丁的节奏持续迭代,从 2.0.1(2020-07-02)到 2.0.25(2020-12-28)共发布了 25 个补丁版本。整体时间线如下:

版本发布时间版本发布时间
v2.02020-06-22v2.0.142020-10-12
v2.0.12020-07-02v2.0.152020-10-19
v2.0.22020-07-13v2.0.162020-10-26
v2.0.32020-07-20v2.0.172020-11-02
v2.0.42020-07-27v2.0.182020-11-09
v2.0.52020-08-03v2.0.192020-11-17
v2.0.62020-08-10v2.0.202020-11-23
v2.0.72020-08-17v2.0.212020-11-30
v2.0.82020-08-24v2.0.222020-12-07
v2.0.92020-08-31v2.0.232020-12-14
v2.0.102020-09-07v2.0.242020-12-21
v2.0.112020-09-14v2.0.252020-12-28
v2.0.122020-09-21——
v2.0.132020-09-28——

补丁版本的更新内容集中在四类:新增(新组件、新方法、新配置项)、修复(协程上下文、连接池、注解代理等疑难问题)、优化(错误信息、停止机制、性能与内存)、变更/移除(破坏性行为调整)。下文先展开 2.0 主版本最核心的 AOP 重构,再按主题盘点补丁版本带来的能力演进。

二、核心重构:DI 与 AOP 机制的全面重写

2.0 版本最显著的变化是对 hyperf/di 组件的重构,尤其是 AOP 与注解部分。2.0 使用了一套全新的加载机制来提供 AOP 能力,官方 changelog 将其概括为以下 11 个要点,逐一解读如下。

1. 可以切入任何方式实例化的类

在 1.x 版本中,AOP 只能切入由 DI 容器创建的类,无法切入由new关键字实例化的类;2.0 中两者都可以生效。仅有的例外是那些在启动阶段本身用于提供 AOP 功能的类。

这一能力的本质在于代理生成机制的变化。从当前仓库的 src/di/src/Aop/ProxyManager.php 源码可以推断:2.0 在扫描阶段会根据AspectCollector收集的切面规则(classes与annotations两类)与注解元数据,确定所有需要生成代理的类并统一产出代理文件(initProxiesByReflectionClassMap方法),再通过类加载层面的替换使代理对所有实例化路径生效,而不是像 1.x 那样仅包装容器返回的对象。

2. 支持切入 Final 类

1.x 中 AOP 只能作用于普通类,无法支持Final类;2.0 允许对Final类进行切入。由于代理不再以「目标类的子类」形式存在(见第 6 点),Final 类不再构成阻碍。

3. 构造函数中可使用@Inject与@Value

1.x 版本无法在类的构造函数中读取由@Inject或@Value注解标记的类成员属性值,2.0 修复了这一限制。这意味着依赖注入的解析时机被提前并覆盖到了构造阶段。

4.@Inject/@Value对new创建的对象同样生效

1.x 中只有通过 DI 容器创建的对象才能让@Inject和@Value生效,new关键字创建的对象无法生效;2.0 中两者均可生效。

5. 注解别名(global_imports):无需引入命名空间

1.x 中使用注解必须显式use对应的注解类命名空间;2.0 可以为任一注解提供别名,使用注解时直接书写别名即可。例如可以不加use Hyperf\Di\Annotation\Inject;直接在类属性上标记@Inject。

该机制的配置入口在config/autoload/annotations.php的scan.global_imports项。从 src/di/src/Annotation/ScanConfig.php 源码可见,ScanConfig在初始化时会读取global_imports配置并存储为成员属性$globalImports,供扫描器解析注解时使用。

6. 代理类与目标类同名同构

1.x 生成的代理类是目标类的子类,这会导致__CLASS__、__METHOD__等魔术常量在代理类中返回的是子类(代理类)的信息,而非目标类信息。2.0 中代理类与目标类保持一致的类名和代码结构,从根本上解决了魔术常量的失真问题。作为佐证,2.0.8 版本(PR #2340)修复了__FUNCTION__和__METHOD__魔术方法在 AOP 重写的方法里无法正常工作的问题,正是基于这一同名同构机制。

7. 代理类缓存随源码自动更新

1.x 中只要代理类缓存存在就不会重新生成,即使源代码已变化(此举有利于扫描耗时,但牺牲了开发体验);2.0 中代理类缓存会根据源码变化自动重新生成。当前仓库中 src/di/src/Aop/ProxyManager.php 的isModified()方法正是该逻辑的实现:它比较代理文件与原始类文件的修改时间,当代理文件时间早于源码文件时判定为「已过期」并重新执行$ast->proxy($className)生成新代理。

8. Aspect 增加priority优先级属性

2.0 为 Aspect 类增加了priority优先级属性,可以组织多个 Aspect 之间的执行顺序。当前仓库中 src/di/src/Annotation/Aspect.php 的#[Attribute(Attribute::TARGET_CLASS)]定义包含public ?int $priority = null;其collect()方法(同文件 L31-L50)会合并注解属性与 Aspect 类属性中声明的优先级,若两者不一致会抛出InvalidArgumentException,并最终通过AspectCollector::setAround()保存到切面收集器。

9. 可通过配置文件与 ConfigProvider 定义 Aspect

1.x 只能通过@Aspect注解定义一个切面类;2.0 还支持通过配置文件与 ConfigProvider 来声明切面,为切面的组织方式提供了更大的灵活性。

10. 懒加载无需注册监听器

1.x 使用依赖懒加载功能时,必须注册Hyperf\Di\Listener\LazyLoaderBootApplicationListener监听器;2.0 移除了该监听器(见下文的「类和方法变更」),懒加载开箱即用。

11. 新增annotations.scan.class_map配置

2.0 新增annotations.scan.class_map配置项,通过该配置可以将任意类替换成自定义类,使用时无需做任何改动。该配置同样由 src/di/src/Annotation/ScanConfig.php 的$classMap成员承载(通过getClassMap()读取),并在ProxyManager构造时作为类路径映射的输入参与代理生成。

12. 其他注解/代理相关优化

  • PHP 8 强类型属性注入(PR #1877):在 PHP 8 下使用@Inject注解时,可以通过成员属性的强类型声明替代@var声明,例如:
class Example { /** * @Inject */ private ExampleService $exampleService; }
  • AOP 支持切入 Trait(PR #2002,2.0.1):当 PHP 版本大于等于 7.3 时,AOP 可以切入 Trait。
  • @Inject缺失@var的错误提示优化(PR #2429,2.0.10):使用@Inject且未设置@var时,给出更便于定位问题的错误信息。
  • @Task注解行为调整(PR #2746,2.0.17):@Task注解只在worker进程中执行时投递到task进程执行,其他进程则降级为同步执行。

三、2.0 主版本新增组件与核心能力

1. 协程风格服务(Coroutine Server)

PR #1805 为 Hyperf 引入了 Coroutine Server(协程风格服务),这是 2.0 在运行模型上的重大变化:

  • 配置中心、Crontab、服务监控、消息队列消费者现在可以以协程模式运行;使用协程服务模式时,也必须以协程模式运行这些组件;
  • Hyperf\AsyncQueue\Environment的作用域由「整个进程」改为「当前协程内」;
  • 协程模式下不再支持 Task 机制;
  • 契约类调整:Hyperf\Contract\ProcessInterface::bind(Server $server)变更为bind($server),isEnable()变更为isEnable($server)。

此后多个补丁版本持续完善协程风格下的兼容性:2.0.3 修复CoroutineServer不生成hyperf.pid的问题;2.0.13 修复协程风格下 AMQP 消费者无法启动、Crontab 无法正常工作的问题;2.0.19 修复 NSQ 消费者、ETCD 配置中心BootProcessListener在协程风格下无法使用的问题;2.0.24 修复协程风格服务下SWOOLE_HOOK_FLAGS常量无法生效的问题(该常量目前仍在 src/server/src/Command/StartServer.php 与 src/support/src/Functions.php 中被使用)。

2. 热更新组件hyperf/watcher

2.0.1(PR #1982)新增热更新组件:文件修改后自动收集注解、自动重启服务。2.0.2 为其添加文件扫描驱动(PR #2042),2.0.4 新增Hyperf\Watcher\Driver\FindDriver(PR #2162),后续持续优化:

  • 2.0.5 优化FindDriver的文件变动扫描精度;
  • 2.0.6 修复 watcher 重复收集多次注解的问题;
  • 2.0.16 优化FindDriver使其可在 Alpine 镜像中使用;
  • 2.0.21 新增可选no-restart选项,允许动态修改注解缓存但不重启服务,同时修复scan.ignore_annotations配置在 watcher 下不生效的问题;
  • 2.0.22 明确:使用watcher组件时不可以开启daemonize;
  • 2.0.1/2.0.2 还修复了server:watch时@Inject失效、语法错误导致进程异常等问题。

热更新组件在开发阶段的价值在于省去手动重启:修改代码后自动重新扫描注解并重启服务,大幅缩短调试循环。

3. Phar 打包组件hyperf/phar

2.0.23(PR #2872)新增hyperf/phar组件,用于将 Hyperf 项目打包成 phar 独立可执行包。当前仓库中 src/phar/composer.json 仍保留该组件(其描述为 "A component that supports pack Hyperf project as a Phar stand-alone package."),依赖hyperf/command、hyperf/contract、nikic/php-parser等,说明该能力自 2.0.23 引入后持续演进。

4. 响应式编程组件hyperf/reactive-x

2.0 主版本(PR #992)新增hyperf/reactive-x组件,将 ReactiveX 范式集成到 Swoole 与 Hyperf 中。当前仓库中 src/reactive-x/composer.json 显示其依赖reactivex/rxphp:^2.0,并建议配合hyperf/event(使用Observable::fromEvent)与hyperf/process(使用IpcSubject)使用。2.0.11 优化了其 HTTP 路由监听器,使其可以监听任意端口的路由。

5. 信号组件hyperf/signal

2.0 主版本(PR #1819)新增hyperf/signal组件,为进程信号处理提供统一封装。当前仓库中 src/signal/composer.json 仍保留该组件,依赖hyperf/coordinator、hyperf/coroutine等。2.0.3 为WorkerStopHandler监听器增加了SIGINT信号监听;2.0.7 修复了使用 Task 组件且未启动协程时 Signal 组件导致启动报错的问题;2.0.16 优化 AMQP 消费者进程使其可配合 Signal 组件安全停止。

6. Nacos 配置中心组件hyperf/nacos

2.0.3(PR #1554)新增hyperf/nacos组件,将 Nacos 引入 Hyperf 生态。2.0.9(PR #2331)为其补齐了一批能力:

  • 增加授权接口;
  • 新增nacos.enable配置,用于控制是否启用 Nacos 服务;
  • 增加配置合并类型,默认使用全量覆盖;
  • 修复服务或配置不存在时抛出异常的问题。

2.0.23 修复了 Nacos 配置中心在协程风格服务中无法使用的问题。

7. 搜索引擎模型查询组件hyperf/scout

2.0.14(PR #1172)新增基于laravel/scout实现的hyperf/scout组件,可以通过搜索引擎对模型进行查询。相关演进包括:

  • 2.0.15 修复scout:flush执行失败的问题;
  • 2.0.19 优化:当没有配置搜索引擎index或 Elasticsearch 版本高于 7.0 时,使用index而非type作为模型的搜索条件;
  • 2.0.21 为数据导入脚本新增--chunk与--column|c可选参数,允许指定任一字段进行数据插入,解决偏移量过大导致查询效率慢的问题;
  • 2.0.23 变更配置文件scout.php默认使用 Elasticsearch 索引作为模型索引。

8. 统一模型 RPC 客户端hyperf/jet

2.0.6(PR #2125)新增hyperf/jet组件。Jet 是一个统一模型的 RPC 客户端,内置 JSONRPC 协议的适配,可适用于所有PHP (>= 7.2)环境,包括 PHP-FPM、Swoole 与 Hyperf。

9. 资源组件hyperf/resource与hyperf/resource-grpc

2.0.14(PR #1969)新增hyperf/resource与hyperf/resource-grpc组件,可以更方便地将模型转化为 Response(资源响应模式)。

10. Redis 哨兵模式与集群密码支持

  • 2.0.14(PR #1868)为 Redis 组件新增哨兵模式;
  • 2.0.14(PR #2632/#2635)修复 Redis 集群模式无法设置密码的问题(该问题在 2.0.18 的RedisCluster构造函数$auth兼容性修复中进一步完善)。

11. 视图渲染引擎view-engine

2.0.17(PR #2737)新增view-engine组件,可以不需要在 Task 进程中渲染页面。2.0.21(PR #2851)将view组件默认配置改为使用view-engine引擎而非第三方 blade 引擎;2.0.23(PR #2958)进一步将view组件默认渲染引擎变更为NoneEngine。当前仓库中 src/view/src/Engine/NoneEngine.php 即该默认引擎的实现,默认配置可见 src/view/publish/view.php。

12. 其他主版本新增能力

  • ExceptionHandler 注解定义方式与优先级(PR #1245):ExceptionHandler新增注解定义方式与priority优先级属性,通过配置文件或注解方式均可定义优先级;
  • model-cache 的 TTL 类型扩展(PR #1844):ttl属性增加\DateInterval类型支持;
  • 连接池释放策略(PR #1855):新增ConstantFrequency恒定频率策略来释放受限连接;
  • Guzzle sink 选项(PR #1871):Guzzle 支持sink选项;
  • PSR-7 Response 响应器(PR #1890):新增Hyperf\HttpServer\ResponseEmitter类响应任意符合 PSR-7 标准的 Response 对象,并抽象Hyperf\Contract\ResponseEmitterInterface契约;同时为Hyperf\HttpMessage\Server\Response新增getTrailers()、getTrailer(string $key)、withTrailer(string $key, $value)方法;
  • WebSocket 发送器扩展(PR #1920):新增Hyperf\WebSocketServer\Sender::close(int $fd, bool $reset = null)。

四、依赖库版本升级清单

2.0 主版本对底层依赖库进行了系统性升级,升级前请确认运行环境满足以下要求:

依赖库升级目标版本说明
ext-swoole>= 4.5运行 Hyperf 2.0 的硬性要求
psr/event-dispatcher^1.0事件调度器契约升级
monolog/monolog^2.0日志库主版本升级
phpstan/phpstan^0.12.18静态分析工具升级
vlucas/phpdotenv^4.0环境变量解析库升级
symfony/finder^5.0文件查找组件升级
symfony/event-dispatcher^5.0事件调度器升级
symfony/console^5.0命令行组件升级
symfony/property-access^5.0属性访问组件升级
symfony/serializer^5.0序列化组件升级
elasticsearch/elasticsearch^7.0Elasticsearch 客户端升级(与 2.0.19 的 index/type 搜索逻辑调整配套)

此外,2.0.2 将hyperf/utils的依赖doctrine/inflector升级到^2.0;2.0.22 将php-amqplib最低版本从v2.7提升到v2.9.2。

五、类与方法变更:升级 2.0 的破坏性变更清单

以下变更在从 1.x 升级到 2.0 时需要重点检查:

1. 移除的类与接口

  • 移除Hyperf\Di\Aop\AstCollector;
  • 移除Hyperf\Di\Aop\ProxyClassNameVisitor;
  • 移除Hyperf\Di\Listener\LazyLoaderBootApplicationListener;
  • 移除Hyperf\Di\Aop\ProxyClassNameVisitor;
  • 移除Hyperf\Dispatcher\AbstractDispatcher类的dispatch(...$params)方法;
  • 移除hyperf/utils组件 ConfigProvider 中的Hyperf\Contract\NormalizerInterface => Hyperf\Utils\Serializer\SymfonyNormalizer映射关系;
  • 移除Hyperf\Contract\Sendable接口及其全部实现(PR #1890);
  • 移除Hyperf\WebSocketServer\Sender对send、sendto、close方法的支持(PR #2065,2.0.2),请改用push与disconnect;
  • 移除配置文件config/server.php(PR #1905),可将其内容合并进config/config.php。

2. 行为变更

  • HTTP 异常处理统一(PR #705):统一抛出Hyperf\HttpMessage\Exception\HttpException依赖类来替代在 Dispatcher 中直接响应,并提供Hyperf\HttpServer\Exception\Handler\HttpExceptionHandler异常处理器处理该类异常;
  • NormalizerInterface 不再自动映射(PR #1846):当require了symfony/serializer库后,不再自动映射NormalizerInterface的实现类,需要手动添加映射关系:
use Hyperf\Utils\Serializer\SerializerFactory; use Hyperf\Utils\Serializer\Serializer; return [ Hyperf\Contract\NormalizerInterface::class => new SerializerFactory(Serializer::class), ];
  • GrpcClient 方法重命名(PR #1924):Hyperf\GrpcClient\BaseClient内simpleRequest、getGrpcClient、clientStreamRequest重命名为_simpleRequest、_getGrpcClient、_clientStreamRequest;
  • WebSocketServer 回调契约弱化:移除Hyperf\Contract\OnOpenInterface、OnCloseInterface、OnMessageInterface、OnReceiveInterface接口中$server参数的强类型声明;
  • Socket.io 事件时机调整(PR #1793):只在onOpen与onClose中触发 connect/disconnect 事件,并将部分类方法从 private 调整为 protected,便于用户重写;
  • SWOOLE_HOOK_FLAGS相关行为(PR #1986,2.0.1):当未设置正确的swoole.use_shortname时,变更脚本exit_code为SIGTERM;
  • 常量组件错误码类型限制(PR #2031,2.0.2):错误码只支持int和string。

3. 新增的契约与查询能力

  • 新增Hyperf\Contract\ResponseEmitterInterface契约与Hyperf\HttpServer\ResponseEmitter实现;
  • Hyperf\WebSocketServer\Sender支持push与disconnect(PR #2065);
  • 2.0.4 为数据库查询事件Hyperf\Database\Events\QueryExecuted添加$result字段,为路由Hyperf\HttpServer\Router\Handler添加$options字段;
  • 2.0.10 为数据库查询构造器新增Hyperf\Database\Query\Builder::forPageBeforeId方法,为 command 组件新增默认选项enable-event-dispatcher用于初始化事件触发器,为 grpc-server 路由新增匿名函数支持;
  • 2.0.18 为@AutoController、@Controller、@Mapping注解添加options参数,用于设置路由元数据;
  • 2.0.20 为Hyperf\Database\Query\Builder新增simplePaginate()方法,并将paginate()返回值类型由PaginatorInterface变更为LengthAwarePaginatorInterface;
  • 2.0.25 新增ProceedingJoinPoint::getInstance()方法,允许在 AOP 中拿到被切入的实例。该方法在当前仓库 src/di/src/Aop/ProceedingJoinPoint.php 中的实现是通过ReflectionFunction获取原始方法闭包绑定的对象($ref->getClosureThis())。

六、补丁版本功能亮点与关键修复盘点

除上述重大特性外,2.0.1~2.0.25 各版本还包含大量值得关注的功能与修复,按主题归类如下。

1. 开发效率与命令行

  • gen:constant命令(PR #1934,2.0.1):用于创建常量类;
  • gen:model增强(2.0.1 起持续迭代):修复morphTo/where导致@property生成失败(PR #2019)、getter与setter并存时@property被@property-read覆盖(PR #2601)、自定义字段与数据库字段一致时替换对应@property(PR #2121)等问题;2.0.4 为模型生成器新增ModelRewriteTimestampsVisitor(按created_at/updated_at重写$timestamps)、ModelRewriteSoftDeletesVisitor(按deleted_at添加/移除 SoftDeletes)、ModelRewriteKeyInfoVisitor(按主键重写$incrementing/$primaryKey/$keyType);2.0.11 新增可选的ModelRewriteGetterSetterVisitor用于生成 Getter 与 Setter;2.0.17 新增--with-ide选项生成对应 IDE 文件,并为 Model 新增@mixin注释提升静态方法提示;
  • vendor:publish增强(2.0.21,PR #2870):支持发布配置目录的能力;2.0.2 修复其没有返回码导致报错的问题;
  • 命令初始化简化(2.0.5,PR #2001):新增$signature参数简化命令行初始化;2.0.2 修复gen:command后脚本必须修改才能被加载的问题;
  • parallel并发控制(2.0.5,PR #2204):新增$concurrent参数快速设置并发量;2.0.22 为Parallel增加count()方法返回同时执行的数量。

2. 数据库与模型

  • 连接释放与事务:2.0.11 修复使用left join等复杂查询后 MySQL 连接无法正常释放的问题;2.0.20 修复在defer中使用数据库组件导致连接被其他协程绑定的问题;2.0.10 优化 model-cache 与事务搭配:事务中删除或修改模型数据会在事务提交后再删除缓存(PR #2438);2.0.23 优化 model-cache 执行完多次事务后只删除一次缓存(PR #2951);
  • 模型缓存:2.0.2 为模型缓存新增 Eager Load 功能(PR #2054);2.0.5 优化 model-cache 预加载使其支持In与InRaw;2.0.16 为CacheableInterface新增getCacheTTL方法,可针对不同模型设置不同缓存时间;
  • 查询构造器:2.0.14 允许whereNull接受数组入参;2.0.12 为MySqlGrammar::compileColumnListing新增column_type返回字段;2.0.4 为查询事件添加$result字段;
  • 模型生成与驼峰模式:2.0.11 修复小驼峰模式模型fill方法不可用、访问器注释被morphTo覆盖的问题;2.0.12 修复小驼峰模式下访问器无法正常工作的问题;
  • ORM 预加载:2.0.22 修复with预加载因循环依赖导致的内存泄露问题;
  • 其他修复:2.0.11 修复 PDO 实例化失败后beginTransaction调用失败的问题;2.0.9 修复pid_file被修改后server:start启动失败的问题。

3. 消息队列与 AMQP/NSQ

  • AMQP:2.0.13 优化关闭 AMQP 连接失败时的错误信息;2.0.20 修复使用fanout交换机时消费者无法工作、连接被客户端意外关闭的问题;2.0.13 修复协程风格下 AMQP 消费者无法启动的问题;
  • 消费者停止机制:2.0.18 为 AMQP 的ConsumerMessage增加$waitTimeout参数,用于在协程风格服务中安全停止服务;2.0.16 优化 AMQP 消费者进程可配合 Signal 组件安全停止;
  • NSQ:2.0.21 修复nsqd配置无法正常工作的问题;2.0.19 修复 NSQ 消费者无法在协程风格下使用的问题;2.0.8 新增RedisNsqAdapter,通过 NSQ 发布消息、使用 Redis 记录房间信息;2.0.7 新增 NSQD 的 HTTP 客户端;
  • AsyncQueue:2.0.11 新增ReloadChannelListener监听器,自动将超时队列里的消息移动到等待执行队列中;2.0 主版本优化 async-queue 的停止机制(PR #1863)。

4. WebSocket 与 Socket.io

  • 2.0.5 修复 WebSocket 握手成功后不立即触发OnOpen、主动关闭连接不触发OnClose的问题;
  • 2.0.8 修复使用 SocketIOServer 内存适配器删除sid时死循环的问题;2.0.2 修复 SocketIOServer 中 Redis 重连失败的问题;
  • 2.0.11 为Socket::getRequest新增方法获取 PSR-7 规范的 Request,并调整事件收集顺序确保sid早于自定义onConnect被添加到房间;2.0.10 为 SocketIO 新增若干 setters;
  • 2.0.18 修复 WebSocket 握手失败导致内存泄露的问题;2.0.22 修复onMessage/onClose回调失败导致进程退出的问题;
  • 2.0.25 为 socketio-server 增加自动清理垃圾的机制;
  • 2.0.3 优化:同时使用 WebSocket 与 Http 服务时,Http 接口被访问不再记录 WebSocket 关闭连接的日志。

5. 配置中心与服务治理

  • 配置中心:2.0.7 修复配置中心拉取配置进程阻塞、Apollo 配置无变更时清除本地配置的问题;2.0.13 优化服务关闭时不再删除 Nacos 中对应的服务;2.0.4 修复自定义进程运行中无法从 Nacos 更新配置的问题;2.0.3 优化 Nacos 进程可安全停止;
  • 服务治理:2.0.21 为service-governance组件新增 Consul 的 ACL Token 支持;
  • ETCD:2.0.19 修复BootProcessListener在协程风格下无法使用的问题。

6. 链路追踪与监控

  • 2.0 主版本起 Tracer 组件持续优化:修复记录两次 Redis 指令(2.0.3)、确保正常执行finish与flush(2.0.16)、异常时也可执行 finish 记录链路(2.0.20)、2.0.25 可在链路追踪中记录异常信息、2.0.17 新增Hyperf\Tracer\Aspect\JsonRpcAspect支持 JsonRPC 链路追踪;
  • 2.0.10 修复使用 Guzzle Coroutine Handler 时无法正确获取和传递traceid与spanid的问题;
  • 2.0.16 新增 Swoole Tracker 的内存检测工具;
  • 2.0.3 修复 Prometheus 使用 Redis 打点且改变 label 时收集报错的问题。

7. HTTP 与中间件

  • 2.0.24 支持自定义 HTTP 状态码;
  • 2.0.3 优化 Response Json 格式化失败时的错误提示;2.0.19 修复 Request 无法实例化时 HTTP 响应数据被清除、存在重复中间件时行为与预期不符的问题;
  • 2.0.9 优化 validation 组件异常捕获器,返回 Response 时自动添加content-type头;
  • 2.0.2 修复 Guzzle 传输大数据包自动添加Expect: 100-Continue头导致请求失败的问题;
  • 2.0.1 修复接口请求数据体为空导致 500、initRequestAndResponse失败导致状态码不符等问题。

8. 协程、上下文与连接池

  • 2.0.2 修复 TCP 服务连接后共用协程导致连接池无法回收连接的问题;2.0.5 修复协程 Server 下建立 keepalive 连接后上下文数据无法在请求结束后销毁的问题;
  • 2.0.13 修复Redis::multi在defer中使用其他 Redis 指令导致连接被两个协程同时使用而报错的问题;
  • 2.0.9 修复使用@Inject未设置@var时的错误信息、优化自定义进程在协程风格服务下的友好停止;
  • 2.0.2 修复定时器规则$min-$max解析有误的问题。

9. 工具类与基础能力

  • 2.0.8 新增Hyperf\Utils\Optional(可安全访问 null 对象上的属性/方法)与更友好的数组递归合并方法Arr::merge;2.0.9 新增助手函数optional();2.0.15 新增Hyperf\Utils\Resource::from将 string 转为 resource;
  • 2.0.24 修复Arr::merge()入参$array1为空时将关联数组错误转化为索引数组的问题;2.0.17 修复Arr::merge因array1缺少array2中的$key报错的问题;
  • 2.0.20 优化工具类Json与Xml抛出一致异常;2.0.20 优化Hyperf\Server\ServerConfig::__set兼容 PHP 8(返回值类型必须为 void)。

10. 验证器与序列化

  • 2.0.9 修复验证器规则digits不支持int的问题;2.0.22 修复alpha_dash不支持int的问题;2.0.3 修复ValidationMiddleware在 WebSocket 服务下报错的问题;
  • 2.0.15 修复 json-rpc 组件异常无法正常序列化的问题,并优化参数解析失败时也能返回对应错误信息;
  • 2.0.17 起 JsonRPC 中以__为前缀的方法(如__construct、__call)不再注册到 RPC 服务中。

11. 其他修复与优化

  • Snowflake:2.0.3 新增 Trait\Hyperf\Snowflake\Concern\HasSnowflake为模型自动生成雪花主键;2.0.15 修复RedisSecondMetaGenerator产生相同元数据的问题;2.0.24 修复未引用hyperf/contract时组件无法使用的问题;
  • Retry:2.0.11 为Fallback回调默认增加throwable参数,并支持class@method格式的 fallback(从 Container 获取类后执行方法);2.0.14 修复使用RetryAnnotationAspect时的内存泄露;2.0.16 修复Budget表现不符合期望的问题;2.0.2 修复RetryFalsy获得正确结果后仍重试的问题;
  • 容器:2.0.16 修复Container::define()因对象已被实例化而无法重定义的问题;2.0.8 优化ResolverDispatcher在循环依赖时给出更友好提示;
  • 常量组件:2.0 主版本优化相同 code 时合并 keys;2.0.2 限定错误码只支持int与string;
  • Snowflake 之外的工具:2.0.23 隐藏命令行执行exit导致的Swoole\ExitException异常;2.0.23 当异步风格服务使用SWOOLE_BASE时从默认事件回调移除onStart事件;2.0.25 优化hyperf/tracer在链路追踪中记录异常信息。

七、升级 2.0 的实践建议

综合主版本变更与补丁演进,从 1.x 升级到 2.0 时建议按以下顺序核查:

  1. 环境检查:确认ext-swoole >= 4.5,并核对上文「依赖库升级清单」中的版本要求;
  2. 配置迁移:将config/server.php合并进config/config.php;检查config/autoload/annotations.php中的scan.global_imports、scan.class_map等新配置项是否可启用;
  3. 代码兼容:按「破坏性变更清单」逐一排查——替换Sender::send/sendto/close为push/disconnect、重命名 GrpcClient 下划线方法、移除对已删除类(AstCollector、ProxyClassNameVisitor、LazyLoaderBootApplicationListener)的引用、为NormalizerInterface手动配置SerializerFactory映射;
  4. 运行模式决策:评估是否采用协程风格服务(Coroutine Server),注意协程模式下不支持 Task 机制,且配置中心、Crontab、消息队列消费者等组件必须使用协程模式运行;
  5. 利用新组件:开发阶段接入watcher热更新组件(注意不可开启daemonize)、打包阶段使用phar组件、模型查询场景评估scout、跨语言 RPC 场景评估jet。

需要注意的是,当前仓库源码已演进到 3.x 主线(如 src/phar/composer.json、src/signal/composer.json 均要求php >= 8.2且依赖~3.2.0),但 2.0 奠定的 AOP 代理机制、协程服务模型、注解扫描体系等核心设计至今延续,本文引用的源码实现(如 ProceedingJoinPoint、ScanConfig、ProxyManager)仍能准确反映 2.0 引入的底层原理。建议以本文为索引,结合对应版本的分支或发布产物查阅细节。

  • 后端
  • 微服务

【免费下载链接】hyperf

🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.

项目地址:https://gitcode.com/gh_mirrors/hy/hyperf
点击查看免费下载

相关推荐

上一篇:三步获取智慧教育平台电子课本:免费下载工具终极指南
下一篇:5分钟打造你的专属知识中心:Obsidian Homepage完全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询