可以跑,但必须确认三点:PHP 7.4 真实生效、Laravel 6 的依赖未被高版本覆盖、关键废弃语法已清理;Laravel 6 官方明确支持 PHP 7.2–7.4,完整兼容,报错多源于环境错配或旧代码残留。

可以跑,但必须确认三点:PHP 7.4 真实生效、Laravel 6 的依赖未被高版本覆盖、关键废弃语法已清理。Laravel 6 官方明确支持 PHP 7.2–7.4,不是“勉强能用”,而是完整兼容——报错几乎都来自环境错配或残留的旧代码。
确认 PHP 7.4 是实际运行版本,而非面板显示版本
宝塔、Docker 或本地 CLI 显示的 php -v 结果,和 Web 请求真正调用的 PHP 版本经常不一致。尤其在宝塔中,站点绑定 PHP 版本后,Nginx 配置可能缓存旧 FastCGI 地址。
- 在
public/index.php顶部加一行:die(phpversion());,用浏览器访问,看输出是否真为7.4.x - 如果用 Docker/Sail,进容器执行
php -v;别只查宿主机 - 宝塔用户务必进入【网站】→【设置】→【PHP版本】页,确认下拉框选中的是
PHP-74,且右上角提示“已生效” - 常见坑:宝塔升级 PHP 后,旧站点仍绑着
PHP-73,页面报Parse error: syntax error, unexpected '?'(这是 PHP 7.4 才支持的空合并运算符,7.3 不认)
检查 composer.json 中的 php 和扩展约束是否匹配 Laravel 6
Laravel 6 要求 "php": "^7.2",但很多人升级时只改了 "laravel/framework": "^6.20",却把 "php" 留在 "^7.4" 甚至误写成 "^8.0"。Composer 会因此跳过部分依赖校验,导致 vendor 缺包或降级。
- 打开
composer.json,找到"php"行,确保是"^7.2"或"^7.4"(两者都合法,但别写"^8.0") - 检查扩展声明:
"ext-mbstring": "*"、"ext-openssl": "*"、"ext-pdo": "*"必须存在且未被注释 - 运行
composer install --no-dev(不要加--ignore-platform-reqs),观察是否报Your requirements could not be resolved - 若报错,删掉
vendor和composer.lock,再重装——旧 lock 文件可能锁死了不兼容的子依赖
清理 PHP 7.4 已废弃但 Laravel 6 未屏蔽的语法
PHP 7.4 本身废弃了部分函数和用法,虽然 Laravel 6 源码已规避,但你的业务代码或第三方包(如老旧的 guzzlehttp/guzzle 6.x)可能还在用。
立即学习“PHP免费学习笔记(深入)”;
- 最常见的是
preg_replace的/e修饰符:PHP 7.4 直接移除,代码会报Deprecated: preg_replace(): The /e modifier is deprecated或直接 Parse error - 检查是否用了
create_function():已被废弃,应改用匿名函数 - 避免在类/方法名中使用
mixed、nullable等 PHP 7.4 新增保留字(哪怕没报错,也建议提前改掉) - 运行
php -l app/Http/Controllers/*.php逐个文件语法检查,比等线上崩了再查快得多
真正卡住的往往不是 Laravel 6 本身,而是你项目里某个自定义迁移类用了 Schema::defaultStringLength(191) 却忘了在 AppServiceProvider::boot() 里调用,或者 .env 里漏了 APP_KEY 导致加密失败——这些错误在 PHP 7.4 下表现得更“安静”,比如只返回空白页,日志里却写着 RuntimeException: No application encryption key has been specified。



















