CodeIgniter 4.7 发布:全面拥抱 PHP 8.2,引入 Worker 模式

5 阅读3分钟

介绍一下近期发布的 CodeIgniter 4.7 版。本次更新包含了一些底层架构变动和对新 PHP 特性的跟进。

核心改动与新特性

  • 强制 PHP 8.2:运行环境的最低要求正式提高到了 PHP 8.2。
  • Worker 模式 (实验性):支持 FrankenPHP Worker 模式,让长效运行的进程成为可能,以提升性能。官方配套给了 php spark worker:installworker:uninstall 命令,底层也加了 Boot::bootWorker() 等相关的清理与重置方法。
  • Signals 机制:新增了基于 SignalTrait 的事件驱动架构,用于组件间的通信。
  • 控制器注解:现在可以用 PHP 8+ 的注解特性来写控制器。
  • API Transformer:自带了结构化的转换器,可以在返回 API 响应前先格式化数据。

数据库与模型改动

  • 支持枚举:模型和实体类现在可以用 EnumCast 原生处理 PHP 枚举类型了。
  • 主键验证前置:模型会在执行数据库查询前先校验主键,一旦出错直接抛出 InvalidArgumentException,不再等数据库返回错误。
  • 批处理更守规矩insertBatch()updateBatch() 现在会老老实实遵循模型的验证规则以及 updateOnlyChanged 设置。
  • 实体深度追踪:实体类现在能追踪嵌套对象和数组的变更,并支持正确的 JSON 序列化。toRawArray() 处理包含实体类的数组时也能正确转换了。
  • 连接检测BaseConnection 新增了 ping() 方法来检测数据库死活,reconnect() 在重连前也会先 ping 一下。所有数据库驱动的异常日志记录也统一了标准。QueryInterface 加了 getOriginalQuery() 方法,BaseModelModel 的类型提示也补全了。

缓存系统重构

  • 整个缓存系统加上了原生的类型声明。
  • CacheInterface 接口加了两个新方法:remember() 用来实现 cache-aside 模式,deleteMatching() 用来批量删缓存。
  • 针对单服务器环境,加了一个高并发的 APCu 缓存驱动。
  • Redis 缓存多了 asyncpersistent 配置项,Redis 的 Session 处理器也支持了 persistent 长连接。
  • PageCache 现在可以通过 Config\Cache::$cacheStatusCodes 过滤特定的 HTTP 状态码来决定缓存策略。

安全与系统增强

  • CSP3 支持:支持内容安全策略 Level 3,包含 script-src-elemreport-to 指令,并支持 SHA-256/384/512 哈希。
  • 密钥平滑轮换:通过配置 Config\Encryption::$previousKeys 可以轮换加密密钥,且旧数据依然能解密。
  • 迁移锁:在分布式环境跑数据库迁移时,可以通过 Config\Migrations::$lock 开启锁机制防止并发冲突。
  • 敏感参数打码:处理密码等敏感数据的方法加上了 PHP 的 SensitiveParameter 属性,防止在堆栈跟踪中泄漏。
  • 视图覆盖:把视图文件放到 app/Views/overrides 目录下,就能直接覆盖框架自带的命名空间视图。
  • HTTP 优化CURLRequest 支持共享 DNS 缓存和连接了,也加了全新的连接和 DNS 缓存超时配置。Cookie 的过期时间格式改成了符合 RFC 7231 的规范。

需要修改代码的破坏性变更

升级前,请对照检查你的项目逻辑:

  • 验证规则regex_match 的占位符强制要求用双大括号,也就是得写成 {{placeholder}}
  • 接口变动:如果你自己实现了 CacheInterfaceQueryInterfaceImageHandlerInterface,必须补充上面提到的新方法(比如 deleteMatching()getOriginalQuery()clearMetadata())。
  • 实体变化$dataCaster 属性现在允许为 null 了。前面提到的深层追踪功能,可能会导致依赖浅层对比的老代码出现问题。
  • 返回类型:框架移除了 #[ReturnTypeWillChange],全面要求写死原生的返回类型。
  • 加密参数:通过 $params 传进去的密钥,不会再直接修改处理器内部的 $key 属性了。Cookie 相关的 SAMESITE_* 常量全改成了首字母大写风格,并且值也做了标准化处理。

被移除的旧方法

  • BaseModel::transformDataRowToArray()
  • Entity::setAttributes()(官方建议改用 injectRawData())。
  • Session 的部分属性以及 stop() 方法。
  • 文本辅助函数的 random_string() 去掉了 basicmd5sha1 这三种类型。
  • 删除了部分过时的 IncomingRequest 检测方法。

其他细节改动

  • 图片处理:ImageMagick 处理器推倒重写,现在纯依赖 PHP 的 imagick 扩展,并新增了 clearMetadata() 方法用来抹除图片的隐私元数据。
  • 时间辅助函数:补上了 addCalendarMonths()subCalendarMonths()isPast()isFuture()
  • 环境配置:可以通过 Paths::$envDirectory 指定 .env 文件存放的路径了。
  • 数据处理:可以通过 Config\Format::$jsonEncodeDepth 来控制 json_encode 的最大深度。
  • 网络与爬虫:更新了 User Agent 里的 robots 列表,覆盖了新出的搜索引擎爬虫。SMTP 发信支持通过 Config\Email::$SMTPAuthMethod 指定授权方式。
  • 调试工具栏:修复了遇到 HTMX、Turbo 等 AJAX 请求时导致崩溃的问题,并且能更聪明地识别二进制或流式响应。Memcached Session 处理器现在也支持数据库连接持久化了。

中文手册已更新到 4.7

中文手册已更新到 4.7.2,并对手册进行了全面的重新翻译,为大家提供更好的阅读体验,点击这里查看。