首页 / 资讯中心 / 文章详情

Hyperf 2.0 系列版本更新深度解读:AOP 机制重构、协程服务与全组件能力演进

Hyperf 2.0 系列版本更新深度解读:AOP 机制重构、协程服务与全组件能力演进 ★ FEATURED ARTICLE
后端微服务【免费下载链接】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.12.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.12020-07-02到 2.0.252020-12-28共发布了 25 个补丁版本。整体时间线如下版本发布时间版本发布时间v2.02020-06-22v2.0.142020-10-12v2.0.12020-07-02v2.0.152020-10-19v2.0.22020-07-13v2.0.162020-10-26v2.0.32020-07-20v2.0.172020-11-02v2.0.42020-07-27v2.0.182020-11-09v2.0.52020-08-03v2.0.192020-11-17v2.0.62020-08-10v2.0.202020-11-23v2.0.72020-08-17v2.0.212020-11-30v2.0.82020-08-24v2.0.222020-12-07v2.0.92020-08-31v2.0.232020-12-14v2.0.102020-09-07v2.0.242020-12-21v2.0.112020-09-14v2.0.252020-12-28v2.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与Value1.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 定义 Aspect1.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 支持切入 TraitPR #20022.0.1当 PHP 版本大于等于 7.3 时AOP 可以切入 Trait。Inject缺失var的错误提示优化PR #24292.0.10使用Inject且未设置var时给出更便于定位问题的错误信息。Task注解行为调整PR #27462.0.17Task注解只在worker进程中执行时投递到task进程执行其他进程则降级为同步执行。三、2.0 主版本新增组件与核心能力1. 协程风格服务Coroutine ServerPR #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/watcher2.0.1PR #1982新增热更新组件文件修改后自动收集注解、自动重启服务。2.0.2 为其添加文件扫描驱动PR #20422.0.4 新增Hyperf\Watcher\Driver\FindDriverPR #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组件时不可以开启daemonize2.0.1/2.0.2 还修复了server:watch时Inject失效、语法错误导致进程异常等问题。热更新组件在开发阶段的价值在于省去手动重启修改代码后自动重新扫描注解并重启服务大幅缩短调试循环。3. Phar 打包组件hyperf/phar2.0.23PR #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-x2.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/signal2.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/nacos2.0.3PR #1554新增hyperf/nacos组件将 Nacos 引入 Hyperf 生态。2.0.9PR #2331为其补齐了一批能力增加授权接口新增nacos.enable配置用于控制是否启用 Nacos 服务增加配置合并类型默认使用全量覆盖修复服务或配置不存在时抛出异常的问题。2.0.23 修复了 Nacos 配置中心在协程风格服务中无法使用的问题。7. 搜索引擎模型查询组件hyperf/scout2.0.14PR #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/jet2.0.6PR #2125新增hyperf/jet组件。Jet 是一个统一模型的 RPC 客户端内置 JSONRPC 协议的适配可适用于所有PHP ( 7.2)环境包括 PHP-FPM、Swoole 与 Hyperf。9. 资源组件hyperf/resource与hyperf/resource-grpc2.0.14PR #1969新增hyperf/resource与hyperf/resource-grpc组件可以更方便地将模型转化为 Response资源响应模式。10. Redis 哨兵模式与集群密码支持2.0.14PR #1868为 Redis 组件新增哨兵模式2.0.14PR #2632/#2635修复 Redis 集群模式无法设置密码的问题该问题在 2.0.18 的RedisCluster构造函数$auth兼容性修复中进一步完善。11. 视图渲染引擎view-engine2.0.17PR #2737新增view-engine组件可以不需要在 Task 进程中渲染页面。2.0.21PR #2851将view组件默认配置改为使用view-engine引擎而非第三方 blade 引擎2.0.23PR #2958进一步将view组件默认渲染引擎变更为NoneEngine。当前仓库中 src/view/src/Engine/NoneEngine.php 即该默认引擎的实现默认配置可见 src/view/publish/view.php。12. 其他主版本新增能力ExceptionHandler 注解定义方式与优先级PR #1245ExceptionHandler新增注解定义方式与priority优先级属性通过配置文件或注解方式均可定义优先级model-cache 的 TTL 类型扩展PR #1844ttl属性增加\DateInterval类型支持连接池释放策略PR #1855新增ConstantFrequency恒定频率策略来释放受限连接Guzzle sink 选项PR #1871Guzzle 支持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.02.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 #20652.0.2请改用push与disconnect移除配置文件config/server.phpPR #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 #1924Hyperf\GrpcClient\BaseClient内simpleRequest、getGrpcClient、clientStreamRequest重命名为_simpleRequest、_getGrpcClient、_clientStreamRequestWebSocketServer 回调契约弱化移除Hyperf\Contract\OnOpenInterface、OnCloseInterface、OnMessageInterface、OnReceiveInterface接口中$server参数的强类型声明Socket.io 事件时机调整PR #1793只在onOpen与onClose中触发 connect/disconnect 事件并将部分类方法从 private 调整为 protected便于用户重写SWOOLE_HOOK_FLAGS相关行为PR #19862.0.1当未设置正确的swoole.use_shortname时变更脚本exit_code为SIGTERM常量组件错误码类型限制PR #20312.0.2错误码只支持int和string。3. 新增的契约与查询能力新增Hyperf\Contract\ResponseEmitterInterface契约与Hyperf\HttpServer\ResponseEmitter实现Hyperf\WebSocketServer\Sender支持push与disconnectPR #20652.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变更为LengthAwarePaginatorInterface2.0.25 新增ProceedingJoinPoint::getInstance()方法允许在 AOP 中拿到被切入的实例。该方法在当前仓库 src/di/src/Aop/ProceedingJoinPoint.php 中的实现是通过ReflectionFunction获取原始方法闭包绑定的对象$ref-getClosureThis()。六、补丁版本功能亮点与关键修复盘点除上述重大特性外2.0.12.0.25 各版本还包含大量值得关注的功能与修复按主题归类如下。1. 开发效率与命令行gen:constant命令PR #19342.0.1用于创建常量类gen:model增强2.0.1 起持续迭代修复morphTo/where导致property生成失败PR #2019、getter与setter并存时property被property-read覆盖PR #2601、自定义字段与数据库字段一致时替换对应propertyPR #2121等问题2.0.4 为模型生成器新增ModelRewriteTimestampsVisitor按created_at/updated_at重写$timestamps、ModelRewriteSoftDeletesVisitor按deleted_at添加/移除 SoftDeletes、ModelRewriteKeyInfoVisitor按主键重写$incrementing/$primaryKey/$keyType2.0.11 新增可选的ModelRewriteGetterSetterVisitor用于生成 Getter 与 Setter2.0.17 新增--with-ide选项生成对应 IDE 文件并为 Model 新增mixin注释提升静态方法提示vendor:publish增强2.0.21PR #2870支持发布配置目录的能力2.0.2 修复其没有返回码导致报错的问题命令初始化简化2.0.5PR #2001新增$signature参数简化命令行初始化2.0.2 修复gen:command后脚本必须修改才能被加载的问题parallel并发控制2.0.5PR #2204新增$concurrent参数快速设置并发量2.0.22 为Parallel增加count()方法返回同时执行的数量。2. 数据库与模型连接释放与事务2.0.11 修复使用left join等复杂查询后 MySQL 连接无法正常释放的问题2.0.20 修复在defer中使用数据库组件导致连接被其他协程绑定的问题2.0.10 优化 model-cache 与事务搭配事务中删除或修改模型数据会在事务提交后再删除缓存PR #24382.0.23 优化 model-cache 执行完多次事务后只删除一次缓存PR #2951模型缓存2.0.2 为模型缓存新增 Eager Load 功能PR #20542.0.5 优化 model-cache 预加载使其支持In与InRaw2.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/NSQAMQP2.0.13 优化关闭 AMQP 连接失败时的错误信息2.0.20 修复使用fanout交换机时消费者无法工作、连接被客户端意外关闭的问题2.0.13 修复协程风格下 AMQP 消费者无法启动的问题消费者停止机制2.0.18 为 AMQP 的ConsumerMessage增加$waitTimeout参数用于在协程风格服务中安全停止服务2.0.16 优化 AMQP 消费者进程可配合 Signal 组件安全停止NSQ2.0.21 修复nsqd配置无法正常工作的问题2.0.19 修复 NSQ 消费者无法在协程风格下使用的问题2.0.8 新增RedisNsqAdapter通过 NSQ 发布消息、使用 Redis 记录房间信息2.0.7 新增 NSQD 的 HTTP 客户端AsyncQueue2.0.11 新增ReloadChannelListener监听器自动将超时队列里的消息移动到等待执行队列中2.0 主版本优化 async-queue 的停止机制PR #1863。4. WebSocket 与 Socket.io2.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 新增若干 setters2.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 支持ETCD2.0.19 修复BootProcessListener在协程风格下无法使用的问题。6. 链路追踪与监控2.0 主版本起 Tracer 组件持续优化修复记录两次 Redis 指令2.0.3、确保正常执行finish与flush2.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::merge2.0.9 新增助手函数optional()2.0.15 新增Hyperf\Utils\Resource::from将 string 转为 resource2.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. 其他修复与优化Snowflake2.0.3 新增 Trait\Hyperf\Snowflake\Concern\HasSnowflake为模型自动生成雪花主键2.0.15 修复RedisSecondMetaGenerator产生相同元数据的问题2.0.24 修复未引用hyperf/contract时组件无法使用的问题Retry2.0.11 为Fallback回调默认增加throwable参数并支持classmethod格式的 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 时合并 keys2.0.2 限定错误码只支持int与stringSnowflake 之外的工具2.0.23 隐藏命令行执行exit导致的Swoole\ExitException异常2.0.23 当异步风格服务使用SWOOLE_BASE时从默认事件回调移除onStart事件2.0.25 优化hyperf/tracer在链路追踪中记录异常信息。七、升级 2.0 的实践建议综合主版本变更与补丁演进从 1.x 升级到 2.0 时建议按以下顺序核查环境检查确认ext-swoole 4.5并核对上文「依赖库升级清单」中的版本要求配置迁移将config/server.php合并进config/config.php检查config/autoload/annotations.php中的scan.global_imports、scan.class_map等新配置项是否可启用代码兼容按「破坏性变更清单」逐一排查——替换Sender::send/sendto/close为push/disconnect、重命名 GrpcClient 下划线方法、移除对已删除类AstCollector、ProxyClassNameVisitor、LazyLoaderBootApplicationListener的引用、为NormalizerInterface手动配置SerializerFactory映射运行模式决策评估是否采用协程风格服务Coroutine Server注意协程模式下不支持 Task 机制且配置中心、Crontab、消息队列消费者等组件必须使用协程模式运行利用新组件开发阶段接入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点击查看免费下载相关推荐Hyperf 2.0 版本更新解读DI 与 AOP 机制重构及核心组件演进Hyperf 2.0 版本更新解读DI 与 AOP 机制重构及核心组件演进 本篇指南完整梳理 Hyperf 2.0 主版本2020 06 22 发布及后续后端Web框架微服务RPC框架异步编程Hyperf 2.0 版本全解析DI/AOP 架构重构、协程服务器与生态组件演进v2.0.0 至 v2.0.25 Changelog 深度解读Hyperf 2.0 版本全解析DI/AOP 架构重构、协程服务器与生态组件演进v2.0.0 至 v2.0.25 Changelog 深度解读 本文基于当后端Web框架微服务RPC框架异步编程Hyperf 2.0 版本更新全解析DI/AOP 重构、协程化演进与组件生态升级Hyperf 2.0 版本更新全解析DI/AOP 重构、协程化演进与组件生态升级 本文基于 Hyperf 官方 2.0 系列更新记录系统梳理从 v2.0 大后端Web框架微服务RPC框架异步编程上一篇三步获取智慧教育平台电子课本免费下载工具终极指南下一篇5分钟打造你的专属知识中心Obsidian Homepage完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站