PHP项目从一台服务器搬到另一台服务器,核心就两步:代码文件打包传输加数据库导出导入,其中代码用压缩包方式传最稳,数据库用mysqldump或phpMyAdmin导出再导入。
很多朋友第一次做服务器迁移,心里没底,怕搞丢数据,其实这个操作比想象中简单,只要按顺序走,每一步盯紧结果,基本不会出大问题,下面从准备工作、传输方法、数据库迁移到环境检查,完整拆开讲清楚。
传输前先确认这三件事
动手之前,花五分钟把新旧两台服务器的信息理清楚,能省掉后面一半的麻烦。
- 确认PHP版本:老服务器是PHP 7.2,新服务器要是默认PHP 8.0,代码里有些老语法可能直接报错,登录新服务器跑一句
php -v,版本差距太大就提前查兼容性。 - 确认扩展组件:phpinfo里看有没有装mysqli、curl、gd库这类常用扩展,代码里用到某个函数,新服务器没装对应扩展,页面白屏都找不到原因。
- 确认绝对路径:项目里写死的
/home/wwwroot/xxx这种绝对路径,换服务器后目录名不同,代码就会崩,用命令pwd看一下新环境根目录,之后改配置时心里有数。
这些信息确认好了,再往下走,事半功倍。
php网站搬家到新服务器怎么做:三种主流传输方式对比
传输方式没有绝对好坏,主要看项目大小、手头工具和网络环境,直接看表格对比:
| 方式 | 适合场景 | 优点 | 缺点 | 是否需要安装 |
|---|---|---|---|---|
| 宝塔面板打包 | 小网站搬家、新手用户 | 全图形界面,点鼠标就行 | 大文件打包时间长 | 无需安装,宝塔自带 |
| scp/rsync命令 | 大项目、服务器间互传 | 文件越大优势越明显,支持断点续传 | 需要懂点Linux命令 | 服务器基本自带 |
| Git拉取 | 代码有版本管理习惯 | 增量上传,只传改动部分 | 新服务器需装Git环境 | 需安装git包 |
宝塔面板打包传输:适合不太熟悉命令行的朋友
如果你两边服务器都装了宝塔面板,这是最简单的路。
- 老服务器宝塔后台打开文件菜单,找到站点根目录,右键选择压缩,格式选zip。
- 压缩完成后,在同目录下找到这个zip文件,点击下载到本地电脑。
- 新服务器宝塔后台同样打开文件菜单,进入新站点的根目录,点击上传,把zip传上去,再右键解压。
整个过程中,注意上传时别选错目录,站点根目录一般在/www/wwwroot/下面,每个站点一个独立文件夹,传错了位置后面改nginx配置更麻烦。
命令行scp和rsync:处理大文件更顺手
项目代码好几个G,压缩包传得慢还容易断,用命令行走ssh通道更靠谱。
scp是简单的单次传输,适合项目文件不多、传一次就完事的场景。
scp /www/wwwroot/old_project.zip root@192.168.1.100:/www/wwwroot/
这条命令把老服务器的压缩包直接推到新服务器的指定目录,输入新服务器密码就开始传。
rsync的精髓在于断点续传和增量同步,如果你已经传过一次,又改了几个文件,rsync只传改动的部分,业内专家指出,对于频繁更新的线上项目,rsync同步比反复打包上传效率高不少。
rsync -avzP /www/wwwroot/old_project/ root@192.168.1.100:/www/wwwroot/new_project/
加P参数就支持断点续传,传的过程中断网了,重新执行同样的命令,它会接着传剩下的部分,不用从头再来。
php源码怎么迁移到服务器上:如果你用Git管理代码
代码本来就放在Git仓库里管理,那传起来更快,连压缩包都不用打。
- 新服务器上安装Git环境:
yum install -y git(CentOS系)或apt install -y git(Ubuntu系)。 - 进入新站点根目录,
git clone你的远程仓库地址。 - 代码拉取完成后,
composer install安装一下PHP依赖(项目用了Composer的话)。 .env文件或配置文件里的数据库连接信息,改成新服务器的对应值。
这种方式的好处是,后续代码有更新,直接回到目录里git pull一下,增量下来,不用反复打包上传。
数据库迁移:从旧服务器完整搬到新服务器
PHP项目几乎都离不开MySQL数据库,代码传完了,数据库落下来,网站等于还缺一条腿。
小数据库直接用phpMyAdmin图形操作
数据量不大(几百MB以内),phpMyAdmin最直观。
老服务器phpMyAdmin里选中要导出的数据库,点击导出,格式选SQL,下载到本地,然后去新服务器phpMyAdmin里,创建一个同名数据库(排序规则选
utf8mb4_general_ci),点击导入,选择刚才下载的SQL文件,执行完成即可。
大数据库用mysqldump命令更稳定
几千上万条记录的表,用网页导入容易超时卡死,命令行方式更稳。
老服务器上执行:
mysqldump -u用户名 -p 数据库名 > backup.sql
输入密码后,数据库被完整导出为一个SQL文件。
新服务器上执行:
mysql -u用户名 -p 数据库名 < backup.sql
这样就完成了导入,整个过程中,SQL文件要先通过scp或宝塔上传到新服务器某个目录,再执行导入命令。
数据库传输两次容易漏掉的操作
SQL文件导入完成后,不少人以为就结束了,这里单独提醒两个容易遗漏的地方:
- 数据库账号权限:新服务器上要新建一个和代码配置文件里对应的数据库账号,并授权给这个库,直接复制粘贴
GRANT ALL PRIVILEGES ON 数据库名. TO '用户名'@'localhost' IDENTIFIED BY '密码';,然后FLUSH PRIVILEGES;刷新权限。 - 字符集不一致:导入后前台页面出现乱码,基本是字符集设置问题,建库建表时统一用
utf8mb4,导入SQL文件之前确认文件头部有没有SET NAMES utf8mb4;,没有就手动补上。
传完了不等于完事:环境配置要逐个核对
代码和数据库都到位了,接下来才是考验耐心的环节,下面几项配置不对,网站照样打不开。
站点配置和伪静态规则
打开新服务器上的nginx或Apache配置(宝塔用户直接在网站列表里点击伪静态),把老服务器上的伪静态规则复制过来,ThinkPHP、Laravel这类框架,少了伪静态规则,访问除首页外的任何页面都会404。
目录权限调整
PHP需要写入缓存和日志的目录,权限不足会直接白屏或报错,比如Laravel的storage目录、ThinkPHP的runtime目录,设置权限为755或775:
chmod -R 775 storage chmod -R 775 runtime
同时确认这些目录的属主是PHP运行用户(宝塔一般是www),否则有了权限但不是你的身份,效果一样。
配置文件里的绝对路径和域名
打开项目里的config.php、.env文件,把里面的site_url、base_url
改成新服务器对应的域名或IP,模板文件里有写死旧域名链接的,也得全局搜一遍替换掉,否则页面图片和跳转链接全部指向旧服务器,等于没搬干净。
切换到新环境后,经常遇到的两类问题,这里把排查思路也一并列出来。
PHP环境和数据库链接的排查顺序
网站打不开,先别急着怀疑代码本身,跟你之前部署流程每一步反向倒查。
页面报500或直接空白。
先看新环境PHP错误日志,宝塔用户直接在日志菜单里看,普通环境执行tail -f /var/log/php-fpm/error.log,检查一下代码项目入口文件(比如public/index.php)第1行前后有没有输出过空格或字符,这会直接导致HTTP头输出失败,页面白屏,如果扩展缺失,日志里会明确显示某个函数未定义,装对应扩展即可。
连接数据库失败报错。
这个最常见的原因是账号密码或网络权限不一致,确认代码配置文件里的服务器地址是localhost还是实际的数据库IP,MySQL默认只监听本机,远程数据库要单独开权限给新服务器的IP地址。
上传大SQL文件超时中断。
一些用户在phpMyAdmin里分多次导入,结果导入到一半报错中断,数据库残留了部分表记录,排查思路是,先在新服务器里删除掉这个新库,重新新建一遍,然后改用命令行的mysql导入方式,避免网页超时问题。
最后一步:切换域名解析前的检查单
一切配置完毕,别急着改域名解析,把下面几条全部核对一遍,再动DNS,就能做到无缝切换不丢数据:
- 检查后台登录页,能否正常显示和验证码加载;
- 打开网站首页,F12看浏览器控制台,有没有报错JS或加载失败的静态资源;
- 发布一条测试内容,确认前台更新后正常显示;
- 确认邮件通知、定时任务(crontab)里设置的访问脚本地址已经更新为新服务器的域名或IP。
域名解析生效时间有快有慢,生效之前,可以临时改本机hosts文件指向新服务器IP,提前预览效果,确认没问题再改正式解析,避免解析切过去之后才发现问题,又得紧急回滚,来回折腾数据库里新增的数据大概率会丢失。
PHP传输到另一台服务器,整体思路就是代码文件和数据库双线并行,文件传输方式按数据量和操作习惯选,数据库导入完成后一定检查账号权限和字符集,走完这套流程,绝大多数迁移场景都能覆盖到。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/672361.html





