- 后端
- 微服务
【免费下载链接】hyperf
🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.
本文是 Hyperf 3.2 版本的官方升级指南详解,覆盖该版本的核心变化:PHP 最低版本提升至 8.2、async-queue组件方法重命名、logger与cache配置结构重构、swow运行环境下的响应发射器依赖调整,以及全套依赖(symfony/*、phpunit、elasticsearch、guzzlehttp等)的版本升级清单。读完本文,你将掌握从 Hyperf 3.1(或更早 3.x)平滑迁移到 3.2 的全部关键动作,并了解如何规避 PHP 8.4 下的 CSV 函数兼容性问题。
3.2 版本概览
Hyperf 3.2 是一次面向运行环境与依赖生态升级的版本,其主要变化集中在三方面:
- PHP 最低版本要求提升至 8.2:从本版本起,
composer.json中声明"php": ">=8.2",意味着项目运行环境、CI 流水线与生产容器都必须满足该基线(仓库根目录 composer.json 中的require段可确认此约束)。 symfony/*组件全面升级:支持^6.0 || ^7.0两个大版本线,覆盖symfony/console、symfony/event-dispatcher、symfony/finder、symfony/http-foundation、symfony/property-access、symfony/serializer、symfony/uid、symfony/var-dumper等组件。phpunit/phpunit升级至^11.0:测试基建同步跟进新的大版本。
此外,3.2 还引入了若干破坏性变更(Break Changes),下文将逐一展开。
破坏性变更详解
1. async-queue:getQueueName()更名为getPoolName()
这是 3.2 中最直接影响业务代码的 API 变更。async-queue组件中,JobInterface::getQueueName()被重命名为getPoolName()。从当前仓库源码可以看到,新接口已全面落地:
- JobInterface.php 中声明
public function getPoolName(): string; - Job.php 中基类默认实现返回
'default' - Functions.php 中全局
dispatch()辅助函数通过$pool ??= $job->getPoolName();决定任务投递到哪个驱动池
<?php // Before(3.2 之前的写法) class CustomJob extends \Hyperf\AsyncQueue\Job { public function getQueueName(): string { return 'custom'; } } // After(3.2 写法) class CustomJob extends \Hyperf\AsyncQueue\Job { public function getPoolName(): string { return 'custom'; } }迁移时只需全局搜索getQueueName并替换为getPoolName,注意实现类(extends Job)与自定义接口实现(implements JobInterface)都需要同步修改。dispatch($job, $delay, $maxAttempts, $pool)的第四个参数$pool语义不变:显式传入时优先使用,否则回落到任务自身的getPoolName()。
2. logger 配置结构重构
3.2 中logger组件的配置结构发生了重大调整。新的配置骨架以default+channels为核心,每个 channel 由handler、formatter、processors三段式声明组成。仓库内hyperf/logger的发布配置 logger.php 提供了标准形态:
<?php use Monolog\Formatter\LineFormatter; use Monolog\Formatter\SyslogFormatter; use Monolog\Handler\NullHandler; use Monolog\Handler\RotatingFileHandler; use Monolog\Handler\StreamHandler; use Monolog\Handler\SyslogHandler; use Monolog\Level; use Monolog\Processor\PsrLogMessageProcessor; use function Hyperf\Support\env; return [ // 默认日志通道 'default' => env('LOG_CHANNEL', 'stack'), // 日志通道列表 'channels' => [ 'stack' => [ 'handlers' => explode(',', (string) env('LOG_STACK', 'single')), ], 'single' => [ 'handler' => [ 'class' => StreamHandler::class, 'constructor' => [ 'stream' => BASE_PATH . '/runtime/logs/hyperf.log', 'level' => Level::Debug, ], ], 'formatter' => [ 'class' => LineFormatter::class, 'constructor' => [], ], 'processors' => [], ], 'daily' => [ 'handler' => [ 'class' => RotatingFileHandler::class, 'constructor' => [ 'filename' => BASE_PATH . '/runtime/logs/hyperf.log', 'level' => Level::Debug, ], ], 'formatter' => [ 'class' => LineFormatter::class, 'constructor' => [], ], 'processors' => [], ], 'stderr' => [ 'handler' => [ 'class' => StreamHandler::class, 'constructor' => [ 'stream' => 'php://stderr', 'level' => Level::Debug, ], ], 'formatter' => [ 'class' => LineFormatter::class, 'constructor' => [], ], 'processors' => [ PsrLogMessageProcessor::class, ], ], 'syslog' => [ 'handler' => [ 'class' => SyslogHandler::class, 'constructor' => [ 'level' => Level::Debug, 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), ], ], 'formatter' => [ 'class' => SyslogFormatter::class, 'constructor' => [], ], 'processors' => [], ], 'null' => [ 'handler' => ['class' => NullHandler::class], ], ], ];新旧配置的关键差异:
- 旧结构围绕
handlers(一维 handler 类名数组)与formatter顶层声明组织;新结构将每个 channel 内的handler拆分为class+constructor两段,formatter同样以class+constructor声明,便于向 Monolog Handler/Formatter 构造函数传参。 - 新增
'default'通道选择,可通过环境变量LOG_CHANNEL动态切换默认通道。 stack通道通过LOG_STACK环境变量(逗号分隔)聚合多个子通道。
升级时,需将旧版config/autoload/logger.php手工迁移到新结构(也可删除旧配置文件后重新发布组件配置再按需裁剪),并核对每个自定义 handler/formatter 的构造函数参数是否正确映射到constructor键。
3. cache 配置结构重构
cache组件的配置同样在 3.2 中重构。新结构采用default+stores的组织方式,每个 store 声明driver、packer、prefix、options等键。hyperf/cache的发布配置 cache.php 是标准范本:
<?php use Hyperf\Cache\Driver\RedisDriver; use Hyperf\Codec\Packer\PhpSerializerPacker; use function Hyperf\Support\env; return [ 'default' => env('CACHE_DRIVER', 'default'), 'stores' => [ 'default' => [ 'driver' => RedisDriver::class, 'packer' => PhpSerializerPacker::class, 'prefix' => 'c:', 'skip_cache_results' => [], 'options' => [ 'pool' => 'default', ], ], // 'sqlite' => [ // 'driver' => Hyperf\Cache\Driver\SqliteDriver::class, // 'packer' => Hyperf\Codec\Packer\PhpSerializerPacker::class, // 'prefix' => 'c:', // 'database' => ':memory:', // 'table' => 'hyperf_cache', // 'options' => [ // PDO::ATTR_CASE => PDO::CASE_NATURAL, // PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, // PDO::ATTR_STRINGIFY_FETCHES => false, // PDO::ATTR_EMULATE_PREPARES => false, // ], // 'max_connections' => 10, // ], ], ];新旧配置的关键差异:
- 顶层从“单一 driver 声明”演变为
stores多存储配置,通过CACHE_DRIVER环境变量选择默认存储。 - 每个 store 显式声明
driver(驱动类)、packer(序列化打包器,默认PhpSerializerPacker)、prefix(键前缀)与skip_cache_results(需要跳过缓存的注解方法结果白名单)。 options.pool指定底层 Redis 连接池名称,与hyperf/redis的池配置联动。
升级时,把旧的config/autoload/cache.php对照新结构重写,尤其注意自定义驱动与打包器类的命名空间是否正确,以及prefix、pool是否沿用了原值。
4. 使用 swow 时必须补充 response emitter 依赖
3.2 中,若你的运行环境使用swow(而非默认的swoole),需要手动在依赖注入配置中声明 HTTP 响应发射器实现,否则 HTTP 服务无法正确向客户端输出响应:
<?php // config/autoload/dependencies.php use Hyperf\Contract\ResponseEmitterInterface; use Hyperf\Engine\ResponseEmitter; return [ ResponseEmitterInterface::class => ResponseEmitter::class, ];从源码结构看,hyperf/http-server的 ConfigProvider.php 在 Swoole 场景下默认完成了ResponseEmitterInterface::class => ResponseEmitter::class的绑定(对应实现见 ResponseEmitter.php,接口定义见 contract)。而 Server.php 通过构造函数注入ResponseEmitterInterface来发送响应。swow 场景不会自动绑定该依赖,因此需要你在应用层dependencies.php中显式补充。升级到 3.2 后,如果发现 HTTP 请求“无响应”或抛出依赖解析异常,优先检查这一项。
依赖升级清单
3.2 版本对依赖的约束汇总如下(与仓库根目录 composer.json 中require/require-dev声明保持一致):
| 依赖 | 3.2 版本要求 | 说明 |
|---|---|---|
php | >=8.2 | 运行环境最低版本 |
elasticsearch/elasticsearch | ^8.0 \|\| ^9.0 | 兼容 ES 8 / 9 客户端 |
nikic/php-parser | ^5.6 | 注解与 AOP 解析底层依赖 |
symfony/* | ^6.0 \|\| ^7.0 | 控制台、序列化、事件分发等组件 |
phpunit/phpunit | ^11.0 | 测试框架 |
google/protobuf | ^3.6.1 \|\| ^4.2 | gRPC 相关 |
guzzlehttp/guzzle | ^7.0 | HTTP 客户端 |
注:仓库根
composer.json的require-dev中还可见symfony/polyfill-php83、symfony/polyfill-php84、symfony/polyfill-php85等 polyfill 依赖,为运行环境提供了跨小版本 PHP 的兼容性兜底。
升级建议的执行顺序:
# 1. 先更新 PHP 运行环境到 8.2+ php -v # 2. 更新框架与各组件(以 hyperf/hyperf 为根包时) composer update hyperf/* -W # 3. 若使用 swow 运行环境,确认 dependencies.php 已补充 ResponseEmitter 绑定若项目按组件独立引入(如hyperf/async-queue、hyperf/logger、hyperf/cache),只需在各自composer.json中确认php >=8.2与对应依赖约束,再执行composer update。
PHP 8.4 注意事项:fgetcsv / fputcsv 的 escape 参数
如果你在升级 3.2 的同时已经(或计划)使用 PHP 8.4,需要留意:PHP 8.4 起fgetcsv与fputcsv的escape参数不再有隐式默认值,必须显式传入。
fputcsv($fp, $fields, escape: ''); fgetcsv($fp, escape: '');这意味着所有直接调用 CSV 函数、或通过League\Csv等第三方库间接触发底层 CSV 解析的代码,在 PHP 8.4 下都必须按上述方式补充escape: ''参数,否则会抛出参数缺失相关的错误(或行为变化)。建议在升级脚本/CI 中对涉及 CSV 导出的功能增加回归测试。
升级自检清单
完成上述所有动作后,可对照以下清单确认迁移到位:
- 运行环境:
php -v输出 8.2 及以上;composer.json中php约束为>=8.2。 - async-queue:全局搜索
getQueueName,确认业务代码已全部替换为getPoolName。 - logger 配置:
config/autoload/logger.php已迁移到default+channels新结构,自定义 handler 的constructor参数正确。 - cache 配置:
config/autoload/cache.php已迁移到default+stores新结构,driver/packer/prefix/options.pool完整。 - swow 环境:
config/autoload/dependencies.php已声明ResponseEmitterInterface => ResponseEmitter绑定。 - 依赖:
composer update无冲突;phpunit版本为 11.x。 - PHP 8.4:CSV 相关调用均已显式传入
escape参数。
按以上步骤完成迁移后,即可在 PHP 8.2+ 与升级后的依赖生态上稳定运行 Hyperf 3.2。
- 后端
- 微服务
【免费下载链接】hyperf
🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.
相关推荐
Hyperf 3.2 升级指南:PHP 8.2 基线、配置结构重构与依赖升级全解析
Hyperf 3.2 升级指南:PHP 8.2 基线、配置结构重构与依赖升级全解析 本文以 docs/en/upgrade/3.2.md https://lin
后端Web框架微服务RPC框架异步编程Hyperf 3.2 升级指南:PHP 8.2 基线、async-queue 接口重命名与配置结构变更全解析
Hyperf 3.2 升级指南:PHP 8.2 基线、async queue 接口重命名与配置结构变更全解析 本文是一份针对 Hyperf 3.2 版本的完整升
后端微服务Hyperf 3.2 升级完全指南:破坏性变更、新增能力与迁移实战
Hyperf 3.2 升级完全指南:破坏性变更、新增能力与迁移实战 Hyperf 3.2 是 Hyperf 协程框架在 3.x 系列上的重要迭代版本,本文基于仓
后端微服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考