浅析如何创建和使用Shell脚本实现PHP部署自动化

张开发
2026/4/10 15:08:20 15 分钟阅读

分享文章

浅析如何创建和使用Shell脚本实现PHP部署自动化
如果你的 PHP 部署流程是这样的SSH 登录服务器git pullcomposer install可能跑一下php artisan migrate清一些缓存重载 PHP-FPM 或 nginx双手合十祈祷这个流程能跑直到你要管理多台服务器你需要快速回滚你忘了某个小步骤然后生产环境炸了团队里其他人的操作方式跟你不太一样到那时候部署就不再是一个任务了——它变成了一种仪式脆弱、没有文档、而且只有知道确切步骤的那个人才能搞定。Shell 脚本是解决这个问题的一种非常简单的方式。你不需要 Kubernetes、Terraform也不需要一整套 CI/CD 平台来实现真正的部署自动化。一个写得好的 shell 脚本可以把 15 条手动命令变成一条可重复执行的命令让你的部署过程用代码记录下来减少人为错误和哎呀我忘了清缓存的时刻成为后续 CI/CD 流水线的构建基础在这篇文章中我们将讲解Shell 脚本基础从 PHP 开发者的角度为 PHP 应用构建一个简单的部署脚本用安全检查、日志、回滚来改进它用releases/和current/符号链接组织部署把脚本接入 Git 或 CI读完之后你会有一个可以适配到自己应用的部署脚本——无论是 Laravel 项目、自定义 PHP 后端还是其他业务系统。PHP 应用部署的核心步骤在写任何脚本之前先搞清楚在你的场景下部署具体意味着什么会很有帮助。在 Linux 服务器上一个典型的 PHP 部署可能需要获取代码克隆仓库或拉取最新更改切换到特定的分支或标签安装依赖composer install --no-dev --optimize-autoloader可选前端npm ci npm run build准备环境确保.env文件存在链接共享目录上传文件、storage、日志运行维护任务数据库迁移php artisan migrate --force清除/优化缓存php artisan config:cache、route:cache等切换版本并重启服务更新符号链接指向新版本重载 PHP-FPMsystemctl reload php-fpm可能需要重启队列 worker可选回滚如果出问题能够切换回上一个版本你脚本的工作就是把这一切用可靠、可重复的方式编码下来。Shell 脚本入门PHP 开发者视角如果你对 PHP 很熟悉但对 shell 脚本还不太了解这里有足够的 Bash 基础让你能上手干活。每个 shell 脚本都应该以一行开头告诉系统用什么解释器1#!/usr/bin/env bash这让你的脚本可以像其他命令一样执行。让脚本可执行创建一个文件1nano deploy.sh写入12#!/usr/bin/env bashechoDeploying PHP app...保存然后12chmodx deploy.sh./deploy.sh你应该会看到Deploying PHP app...这样你的第一个 shell 脚本就跑起来了。快速失败set -euo pipefail在脚本顶部shebang 之后加上1set-euo pipefail这做了三件重要的事-e如果任何命令返回非零退出码脚本就退出-u把未设置的变量当作错误-o pipefail如果管道cmd1 | cmd2中cmd1失败了整个管道都算失败这就像告诉你的脚本如果出了任何问题就停下来。别继续跑然后假装一切正常。变量和参数基本变量12APP_NAMEmy-php-appREPO_URLgitgithub.com:yourname/your-app.git访问位置参数1ENVIRONMENT${1:-production}# 如果没提供参数默认是 production运行1./deploy.sh staging在脚本里$ENVIRONMENT就是staging。函数你可以用函数来组织脚本1234567deploy() {echoDeploying to environment: $ENVIRONMENT}rollback() {echoRolling back...}调用它们123456789101112case${1:-deploy}indeploy)deploy;;rollback)rollback;;*)echoUsage: $0 [deploy|rollback]exit1;;esac这种模式让你的脚本更易读、更好维护。退出码exit 0→ 成功exit 1→ 通用失败其他代码可以表示特定错误可选但挺好知道了这些基础你就可以开始自动化真正的工作了。构建简单的 PHP 部署脚本单服务器让我们从一个直接的场景开始单台 Linux 服务器比如 UbuntuNginx PHP-FPMPHP 应用在/var/www/myapp你通过 SSH 登录服务器然后运行./deploy.sh来部署目录结构我们先保持简单/var/www/myapp/├── .git/├── public/├── vendor/├── storage/└── ...部署流程git pullcomposer install清缓存重载 PHP-FPM这是一个最小脚本123456789101112131415161718192021222324252627282930313233343536373839#!/usr/bin/env bashset-euo pipefailAPP_DIR/var/www/myappPHP_FPM_SERVICEphp8.2-fpm# 根据你的 PHP 版本调整BRANCH${1:-main}# 默认分支log() {echo[$(date %Y-%m-%d %H:%M:%S)] $*}cd$APP_DIRlogFetching latest code from branch $BRANCH...git fetch --allgit checkout$BRANCHgit pull origin$BRANCH--ff-onlylogInstalling PHP dependencies with Composer...COMPOSER_ALLOW_SUPERUSER1 composerinstall\--no-dev \--prefer-dist \--optimize-autoloader# 如果你用的是 Laravel 或其他框架添加框架特定的步骤if[[ -f artisan ]];thenlogRunning database migrations...php artisan migrate --forcelogClearing and caching Laravel configuration...php artisan config:clearphp artisan config:cachephp artisan route:cache ||true# route cache 在开发环境可能会失败filogReloading PHP-FPM service...sudosystemctl reload$PHP_FPM_SERVICElogDeployment completed successfully.用法123chmodx deploy.sh./deploy.sh# 部署 main 分支./deploy.sh production# 如果你想用名为 production 的分支这已经比手动运行每条命令好多了步骤在脚本里清晰可见如果出问题会快速失败任何有权限的人都能运行同样的流程但我们可以大幅改进它。增强安全性备份、检查与回滚上面的简单脚本有个大问题如果迁移挂了或者部署半途出问题你唯一的回滚方式是希望你有备份。让我们开始加安全网。

更多文章