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 新特性应用

  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 => '已发货',
        };
    }
}
  1. readonly class:值对象 / DTO
readonly class Money {
    public function __construct(
        public int ,
        public string ,
    ) {}
}
  1. never return type:throw / exit 的函数
  2. 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. 本地 + 预发:1-2 周测试
  2. 线上灰度:先 5% 流量,监控 24h
  3. 回滚预案:保留 PHP 7.4 镜像,一键切换

需要专业升级服务?查看升级服务 或 查看定价。