必须分四步验证:一查代码(replace create_function、禁用mysql_*、校验mb_strpos参数类型、卸载apcu-bc/mcrypt);二验Composer依赖(check-platform-reqs、升级框架版本、修正php约束);三核系统扩展(oniguruma≥6.9.4、Redis≥5.3.0、GD≥2.3.0、卸载不兼容扩展);四跑闭环测试(php -l语法扫描、E_ALL错误报告、核心路径实测)。

直接运行 PHP 8.1 很可能报错或静默出错,必须提前验证是否满足升级条件。核心不是“能不能装”,而是“代码、依赖、环境”三层是否真正就绪。
一、查项目代码有没有硬性雷区
PHP 8.1 移除了不少函数和写法,不改就崩:
- 全局搜索 create_function() —— 已彻底删除,必须换成
fn()或function() {} - 检查所有 mysql_* 调用(如
mysql_connect)—— 自 PHP 7.0 就废弃,必须迁移到mysqli或PDO - 定位 mb_strpos() 和 mb_stripos() 的第三个参数 —— PHP 8.1 要求必须是整型,传浮点数(比如
round($offset))会致命报错 - 搜 each()、assert('string')、call_user_method() 等已移除特性
二、验 Composer 依赖是否真正支持
光看框架版本号不够,得让工具说话:
- 运行
composer check-platform-reqs,重点看输出里有没有topthink/framework、laravel/framework等关键包标红或提示不兼容 - ThinkPHP 6.x 默认不支持 PHP 8.1,需确认是否已升到 ≥6.3.0;TP8 则原生支持
- Laravel 需 ≥8.75 才完整适配 PHP 8.1,Laravel 9+ 强制要求 PHP 8.0+
- 检查
composer.json中"php": "xxx"字段,必须改成"^8.1"或更宽泛但兼容的范围,否则composer update可能跳过关键更新
三、核系统与扩展是否就位
PHP 8.1 对底层库更严格,缺一个就可能加载失败或行为异常:
立即学习“PHP免费学习笔记(深入)”;
- 确认 oniguruma 版本 ≥ 6.9.4(
rpm -q oniguruma或dpkg -l | grep oniguruma),旧版会导致中文正则匹配错乱 - Redis 扩展需 ≥5.3.0,GD ≥2.3.0,cURL 库需 ≥7.29.0 —— 运行
php -m和php -i | grep curl核实 - 卸载 apcu-bc 和 mcrypt(PHP 8.1 不兼容),mcrypt 功能请迁移到
sodium或openssl - 若用 Docker,确保基础镜像来自 remi-safe(RHEL/CentOS)或 Ondřej Surý 源(Debian/Ubuntu)
四、跑一次最小闭环测试
静态扫描只是第一步,必须触发真实逻辑:
- 在干净 PHP 8.1 环境中(推荐
docker run --rm -v $(pwd):/app php:8.1-cli),执行php -l扫描全部 PHP 文件语法合法性 - 开启完整错误报告:
error_reporting(E_ALL | E_STRICT),运行登录、列表、导出等核心路径 - 特别关注
TypeError、ValueError、ArgumentCountError—— 这些是 PHP 8.1 新增的致命错误类型 - 留意
__get()/__set()中对未声明属性的赋值 —— PHP 8.1 会发E_DEPRECATED,8.2+ 直接报错



















