PHP项目部署脚本自动化怎样做

wen PHP项目 4

PHP项目部署脚本自动化实战指南:从手工FTP到一键发布的蜕变


目录导读

  1. 为什么你需要部署自动化?(痛点与收益)
  2. 部署自动化核心逻辑:构建、传输、释放、回滚
  3. 手写一套极简PHP部署脚本(Shell + Git + Rsync)
  4. 进阶:Webhook触发与CI/CD(Jenkins/码云集成)
  5. 常见故障排查与安全加固
  6. 高频问答(Q&A):解决你最后的疑虑

为什么你需要部署自动化?

PHP项目部署脚本自动化怎样做

想象一下:每次上线都要经历本地压缩、FTP上传、远程解压、清缓存、改权限的“五步走”,一旦某次漏改了配置文件,线上直接白屏,手工部署不仅耗时,而且极易因人为疏忽导致环境不一致,而自动化脚本能将上述流程固化为一条命令,将部署时间从30分钟压缩到1分钟,并且每一步都有日志记录,可回溯、可回滚,这不仅仅是效率提升,更是团队协作规范化的基石。

部署自动化核心逻辑

一个成熟的部署脚本,本质上是在回答四个问题:

  • 构建(Build):代码是否需要编译?Vue前端资源是否需要打包?
  • 传输(Transfer):如何将新代码安全、增量地送到服务器?推荐使用rsync而非scp,因为前者支持断点续传和差异同步。
  • 释放(Release):如何平滑切换版本?最稳妥的方式是软链接切换——新版本放在/www/releases/v1.1/,验证结构后只需将/www/current软链接指向它,实现秒级切换。
  • 回滚(Rollback):脚本必须记录上一次版本号,一旦健康检查失败(如PHP-FPM进程未拉起),立即执行ln -sfn切回旧版本,将影响降到最低。

手写一套极简PHP部署脚本

以下是一个基于deploy.sh的核心片段,适用于大多数LNMP环境:

#!/bin/bash
# 变量定义
REMOTE_USER="www"
REMOTE_HOST="你的服务器IP"
PROJECT_DIR="/www/releases/$BUILD_TAG"
LINK_DIR="/www/current"
# 1. 拉取最新代码(使用GIT)
ssh $REMOTE_USER@$REMOTE_HOST "cd $PROJECT_DIR && git pull origin master"
# 2. 构建前端资源(如果存在)
ssh $REMOTE_USER@$REMOTE_HOST "cd $PROJECT_DIR && if [ -f package.json ]; then npm install && npm run build; fi"
# 3. 同步静态文件(排除用户上传目录)
rsync -avz --exclude='storage/uploads' --delete $PROJECT_DIR/ $REMOTE_USER@$REMOTE_HOST:$PROJECT_DIR/tmp/
# 4. 原子切换软链接
ssh $REMOTE_USER@$REMOTE_HOST "ln -sfn $PROJECT_DIR $LINK_DIR"
# 5. 热重载PHP-FPM(不清空缓存,旧进程优雅退出)
ssh $REMOTE_USER@$REMOTE_HOST "sudo systemctl reload php7.4-fpm"
# 6. 健康检查
curl -I http://yourdomain.com 2>&1 | grep "200 OK" || echo "Rollback needed"

关键点:使用ln -sfn确保切换是原子操作;exclude参数避免覆盖用户的本地图片,这是最常见的坑。

进阶:Webhook触发与CI/CD

手敲命令虽好,但最高效的是git push后自动部署,在Git仓库(如码云/GitHub)后台添加Webhook,指向你服务器上的/deploy.php脚本:

// 接收Token校验,执行shell_exec('bash /var/www/deploy.sh 2>&1');
if ($_GET['token'] === '你的密钥' && $_POST['ref'] === 'refs/heads/master') {
    shell_exec('nohup bash /var/www/deploy.sh >> /var/log/deploy.log 2>&1 &');
    echo 'Deploying...';
}

注意:务必用nohup异步执行,否则Webhook请求会阻塞超时,若公司使用Jenkins,可将deploy.sh挂载为一条构建步骤,实现可视化操作与审计。

常见故障排查与安全加固

  • 权限穿透rsync如果以root执行,同步后的文件属主会变为root,导致PHP-FPM无权限读写。解决:脚本开头用sudo -u www切换用户,或加--chown=www:www参数。
  • 缓存不更新:部分PHP框架有大量配置缓存(如Laravel的bootstrap/cache),自动化脚本中应包含php artisan optimize:clear命令。
  • 安全底线:Webhook脚本绝不能直接用exec()(危险!),建议将deploy.sh放在Web目录之外,只允许特定Token访问,并限制IP来源。

高频问答(Q&A)

Q1:自动化部署时,数据库迁移(Migrate)该不该自动执行? A:不推荐全自动,尤其是drop column或改了索引的迁移,自动执行可能造成数据丢失,建议脚本默认将迁移命令注释掉,由资深工程师手动执行,或者分两步:先备份数据库,再执行迁移。

Q2:用Docker能代替Shell脚本吗? A:Docker适合统一环境,但会引入额外的镜像构建和编排复杂度,如果团队只有2-3台服务器,Shell + Rsync反而更轻量;若是微服务架构,则必须用自动化编排(K8s)。

Q3:如何确保部署到多台服务器时的一致性? A:不要循环SSH去逐台执行,应使用rsync将代码推到其中一台“分发节点”,再通过该节点使用pssh(并行SSH)批量同步,脚本中必须加入--timeout=10参数,防止某台机器宕机导致挂死。

Q4:回滚时经常忘记备份数据库怎么办? A:在切换新版本之前,脚本自动执行mysqldump导出到备份目录,并以时间戳命名,回滚时若涉及代码不涉及库变更,直接切链接即可;若涉及,则通过备份SQL恢复。


部署脚本自动化不是一蹴而就的,建议从“先跑通单机部署”开始,再逐步加入Webhook、健康检查和回滚逻辑,把每一次上线的痛苦,变成脚本迭代的动力,当你看到提交代码后自动完成部署的绿色流水线时,这种“版本失控恐惧感”的消除,就是自动化最好的回报。

抱歉,评论功能暂时关闭!