PHP网站搬家核心在于数据库与文件协同一致性:mysqldump须加--single-transaction和--quick,字符集必须统一为utf8mb4,DB_HOST应设127.0.0.1而非localhost,文件权限需按Web进程用户精确赋权。

PHP网站搬家不是改个配置就能跑起来的事,核心卡点永远在数据库和文件的协同一致性上——导完库不改配置、传完文件忘调权限、字符集不统一,三者任一出错,500 或白屏就是秒级响应。
mysqldump 导出时必须加 --single-transaction
线上 MySQL(InnoDB)导出不加这个参数,mysqldump 会默认锁全表,导致网站卡死、订单丢失。尤其当导出期间有用户下单或后台操作,数据就可能不一致。
-
mysqldump -u root -p --single-transaction --quick 数据库名 > backup.sql是安全底线 -
--quick防止大表导出时内存溢出,强制逐行读取 - 如果数据库含 MyISAM 表,得换用
--lock-tables=false,但务必确认此时无写入 - 导出后立刻校验:用
head -n 20 backup.sql看开头是否有SET AUTOCOMMIT=0;和START TRANSACTION;
导入 SQL 前必须核对目标库字符集
源库是 utf8mb4,目标库是 utf8(或反过来),中文字段直接变 ? 或乱码,且无法逆转。这不是 PHP 层能补救的问题。
- 查源库:执行
SHOW CREATE DATABASE 数据库名;,看DEFAULT CHARACTER SET - 查目标库:同上命令,不一致就重建库:
CREATE DATABASE 新库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 导入时别依赖 phpMyAdmin 默认设置,手动在导入页勾选“utf8mb4”编码
- 导入后快速验证:
SELECT LENGTH('中文'), CHAR_LENGTH('中文');,两个值都为 2 才说明存进去了
config.php 或 .env 里的 DB_HOST 别写 localhost
很多迁移失败是因为新服务器上 MySQL 绑定了 127.0.0.1,而 localhost 在 Unix socket 下走本地套接字,行为不一致——尤其当新环境禁用了 socket 连接时,直接连不上。
立即学习“PHP免费学习笔记(深入)”;
- 统一改成
127.0.0.1,绕过 socket 解析歧义 - 如果新库在另一台机器,DB_HOST 就填真实 IP,别幻想内网 DNS 自动解析
- Laravel 用户注意:
.env中的DB_HOST和DB_PORT必须成对检查,改了 host 忘改 port 是常见低级错误 - 改完配置后,用
php -r "var_dump(pdo_connect());"(或类似简单脚本)直连测试,别等首页报错才排查
文件迁移后 storage/、runtime/、uploads/ 权限常被忽略
网站能打开,但上传失败、缓存不更新、后台登录后跳回首页——八成是目录权限没给对,而不是代码或数据库问题。
- 先确认 Web 进程用户:
ps aux | grep -E '(apache|nginx|php-fpm)',常见为www-data或nginx - 递归赋权只针对可写目录:
chown -R www-data:www-data storage/ runtime/ uploads/(ThinkPHP 是runtime/,Laravel 是storage/和bootstrap/cache/) - 别对整个网站根目录
chown -R,否则可能破坏 composer autoload 权限或私钥文件安全 - 日志目录如
/var/log/myapp/要提前mkdir -p并赋权,否则第一行日志就写失败
最麻烦的永远不是“怎么导”,而是“导完谁在改数据”“目标磁盘还剩多少空间”“备份文件传到一半断了有没有校验机制”。这些细节不会报错,但会让迁移变成一场静默崩溃。



















