数据库备份需用mysqldump --no-definer等参数排除DEFINER和触发器;PHP须版本及扩展(openssl、mbstring等)一致且mbstring.func_overload=0;Web服务器需正确配置时区、.env权限与伪静态规则,迁移后清空runtime目录。

数据库备份必须包含结构+数据,且禁用DEFINER
直接用mysqldump导出时,默认可能带上CREATE DEFINER语句,新服务器若用户权限不同或不存在该用户,导入会失败甚至静默跳过表。这不是警告,是实际卡住的点。
- 用
mysqldump --no-definer --skip-triggers --single-transaction -u root -p your_db > backup.sql(--no-definer是关键,--skip-triggers防触发器权限问题) - 确认
backup.sql里没有DEFINER=`xxx`@`%`这类行,用grep DEFINER backup.sql快速检查 - ThinkPHP如果用了视图或存储过程,需额外加
--routines,但多数项目不用,加了反而容易因权限报错
PHP版本和扩展必须与原环境一致,尤其openssl和mbstring
ThinkPHP 5.1+ 对mbstring函数行为敏感,比如mb_internal_encoding()返回值不一致会导致验证码、JSON解析异常;openssl版本太低则think\facade\Cache的Redis加密连接直接抛SSL operation failed。
- 在旧服务器跑
php -v和php -m | grep -E '^(openssl|mbstring|pdo|pdo_mysql|curl)$',记下精确版本和启用状态 - 新服务器别只装
php-mbstring,要确认mbstring.func_overload是否为0(ThinkPHP要求关闭),查php -i | grep func_overload - Apache或Nginx的
php.ini里date.timezone必须设对,否则think\cache\driver\File生成的缓存文件时间戳错乱,清缓存失效
.env文件权限必须为644,且不能被Web服务器直接访问
迁移后首页白屏或报Environment variable not loaded,90%是.env没读到;剩下10%是它被当成普通文件暴露了——比如Nginx配置漏了location ~ /\.env { deny all; },安全扫描直接标高危。
- 上传后立刻执行
chmod 644 .env,别用755,PHP-FPM用户不需要执行权限 - 检查
APP_DEBUG是否设为false,线上环境开调试等于公开日志路径和SQL语句 - 如果用
php think optimize:config生成了runtime/cache/下的配置缓存,迁移后必须删掉整个runtime/目录再访问一次首页,否则旧缓存里的数据库host还是老地址
伪静态规则要适配新Web服务器类型,Nginx和Apache写法不能混用
ThinkPHP的public/.htaccess对Nginx完全无效,而Nginx的try_files规则写错一行,就会导致所有/index.php/some/route请求404,但/index.php本身能打开——这种半通状态最耗时间排查。
- Apache用户:确认
mod_rewrite已启用,且AllowOverride All在public目录配置里生效 - Nginx用户:用
try_files $uri $uri/ /index.php?$query_string;,别抄网上过时的if (!-e $request_filename)写法,会和PATH_INFO冲突 - 无论哪种服务器,都要验证
$_SERVER['REQUEST_URI']在入口文件里是否含index.php,这是路由解析的起点,错了整个URL匹配就崩
环境变量、文件权限、伪静态这三块只要有一处偏差,错误表现都像“程序没反应”,但原因天差地别。动手前先比对旧服务器的phpinfo()页面和ls -l输出,比重装十遍都管用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











