PHP 8.1 带来了大量新特性(enum、readonly、never、 fibers),同时也是 8.0 的继承。 本文复盘一个真实的中型项目从 7.4 升到 8.1 的全过程。
升级前:环境与依赖
- PHP 8.1 要求 OpenSSL 1.1+,旧服务器需先升级 OS
- Composer 升级到 2.3+
- 框架/库版本:TP6.0+ / Laravel 9+ / Symfony 6+ 兼容
- 第三方 SDK:检查官方支持矩阵
代码层:8.0 破坏性变更
- 字符串与数字比较更严格: == 'foo' 改为 false
- 未定义变量不再静默为 null(某些 opcache 场景)
- 移除 money_format()(用 NumberFormatter 替代)
- 移除 each()、create_function()
代码层:8.1 新特性应用
- enum:替代魔术字符串 / class const
enum OrderStatus: string {
case Pending = 'pending';
case Paid = 'paid';
case Shipped = 'shipped';
public function label(): string {
return match() {
self::Pending => '待支付',
self::Paid => '已支付',
self::Shipped => '已发货',
};
}
}
- readonly class:值对象 / DTO
readonly class Money {
public function __construct(
public int ,
public string ,
) {}
}
- never return type:throw / exit 的函数
- Fibers:协程基础(实际项目慎用,等生态成熟)
JIT:值得开吗
PHP 8.0+ 引入 JIT(Tracing JIT),对 CPU 密集型场景(图像处理、数学计算)有 2-3x 提升。 但对普通 Web 项目(IO 密集)收益有限,反而可能增加内存占用。 建议:
- 默认不开
- 计算密集型服务单独开(CLI 脚本、Worker)
- 压测对比再决定
性能提升预期
- 纯 PHP 7.4 → 8.1:约 10-15% 提升
- 启用 OPcache 优化(不变)
- 启用 JIT:CPU 密集型 2-3x,普通 Web 几乎无感
灰度上线
- 本地 + 预发:1-2 周测试
- 线上灰度:先 5% 流量,监控 24h
- 回滚预案:保留 PHP 7.4 镜像,一键切换