只要按顺序确认php版本与扩展匹配、.env文件正确加载、数据库迁移完整、web服务器配置无误,90%的迁移失败都能当场定位;需逐项校验版本差异、扩展启用、编码格式、字符集及重写规则等关键点。

旧服务器停机、新环境跑不起来、数据库连不上、.env 静默失效——这些问题不是配置没写对,而是重建 PHP 运行环境时漏掉了关键校验点。只要按顺序确认这四件事,90% 的迁移失败都能当场定位。
确认 PHP 版本与扩展是否完全匹配
新服务器上 php -v 显示 8.2.12,但旧系统实际用的是 8.2.5,这种小版本差就可能触发 Redis 扩展加载失败或 mysqli 认证方式不兼容。更常见的是扩展缺失:旧站用了 imagick 处理图片,新环境只装了 gd,上传就卡在 Class 'Imagick' not found。
- 登录旧服务器,执行
php -m和php --ini,记下所有启用的扩展名和Loaded Configuration File路径 - 在新服务器上逐条比对:
php -m | grep -E "redis|imagick|pdo_mysql|opcache" - 若扩展缺失,用对应包管理器安装(如 Ubuntu 用
apt install php-redis,CentOS 用yum install php-pecl-redis) - 特别注意 MySQL 认证插件:PHP 8.0+ 默认用
caching_sha2_password,但旧库可能是mysql_native_password;可在 MySQL 中执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpass';强制切换
.env 文件是否被框架真正读取
文件存在 ≠ 被加载。ThinkPHP 和 Laravel 都依赖 Dotenv 库解析,但任何编码、空格或符号错误都会导致整个文件静默跳过——APP_DEBUG=true 不生效、DB_HOST 还是默认值,日志里却没有任何报错。
- 用
file -i .env(Linux/macOS)或 VS Code 查看编码,必须是UTF-8 without BOM;Windows 记事本保存的文件大概率带 BOM - 检查等号两侧:不允许有空格,
DB_PASSWORD = mypass是错的,必须是DB_PASSWORD=mypass - Laravel 用户运行
php artisan tinker后输入env('APP_NAME'),返回null就说明没加载;ThinkPHP 用户执行php think status,看Env loaded是否为true - 删掉
runtime/config.php(ThinkPHP)或bootstrap/cache/config.php(Laravel),强制框架重读.env
数据库迁移是否还原了完整状态
php artisan migrate 成功不代表数据就齐了。它只建表、设索引、跑 up() 方法,但初始数据(如管理员账号、系统配置项)往往藏在 seeds 或单独 SQL 文件里。更隐蔽的问题是字符集:旧库用 utf8mb4_unicode_ci,新库建库时选了 utf8_general_ci,存 emoji 或生僻字就直接截断。
- 先确认建库语句含
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci - Laravel 项目检查是否有
DatabaseSeeder,执行php artisan db:seed;若提示Class ... does not exist,说明composer dump-autoload没刷新类映射 - ThinkPHP 用户需手动导入
database.sql或执行php think migrate:run(如果用了topthink/think-migration) - 用
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'your_db';直接查新库实际字符集
Web 服务器能否正确转发 PHP 请求
Nginx 或 Apache 配置没改,index.php 就永远 404。Laravel 要求所有请求都经由 public/index.php 入口,而 ThinkPHP 默认入口是 public/index.php 或根目录下的 index.php,路径稍错一点,$_GET 和路由就全乱。
- Nginx 用户检查
location ~ \.php$块里fastcgi_param SCRIPT_FILENAME的值:Laravel 必须是$realpath_root$fastcgi_script_name,ThinkPHP 通常是$document_root$fastcgi_script_name - Apache 用户确认
.htaccess是否启用:a2enmod rewrite+AllowOverride All缺一不可 - 最简验证法:在
public/下放一个info.php,内容为<?php phpinfo(); ?>,能打开说明 Web 服务和 PHP 通了;再删掉它,访问/看是否进框架,否则就是重写规则问题 - 权限陷阱:Web 服务器用户(如
www-data)必须对storage/和bootstrap/cache/有写权限,chmod -R 775 storage bootstrap/cache比盲目777更安全
真正卡住人的从来不是某一行命令,而是 .env 里一个看不见的 BOM、MySQL 里一个没声明的 COLLATE、Nginx 配置中一个拼错的 $realpath_root——这些点不逐个摸排,光重启服务只会让问题更模糊。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











