PHP 项目部署方式
可以。不上容器,也比 FTP 覆盖文件强很多。推荐按成熟度分三档:
方案 1:Git 拉代码部署,最低改造
适合:小团队、单机 PHP 项目、暂时不想引入复杂 CI/CD。
流程
服务器上保留项目 Git 仓库:
cd /var/www/project
git fetch origin
git checkout main
git pull
composer install --no-dev--optimize-autoloader
php artisan migrate --force# Laravel 才需要
php artisan config:cache # Laravel 才需要
sudo systemctl reload php-fpm优点
-
比 FTP 安全、可追踪
-
能知道线上当前是什么 commit
-
可以快速回滚:
git checkout <previous_commit>
composer install --no-dev--optimize-autoloader
sudo systemctl reload php-fpm问题
-
部署过程中可能出现“半更新”状态
-
多台机器同步麻烦
-
权限、缓存、依赖安装容易出问题
适合作为第一步替代 FTP,但不是最终形态。
方案 2:CI/CD 自动部署,推荐起点
适合:希望团队规范化,不想手动登录服务器。
可以用:
-
GitHub Actions
-
GitLab CI
-
Jenkins
-
Gitea Actions
-
Coding / 阿里云云效 / 腾讯 CODING
基本逻辑
开发合并到 main 或打 tag 后自动执行:
-
拉代码
-
安装依赖
-
跑测试
-
打包产物
-
上传到服务器
-
执行部署脚本
-
reload PHP-FPM / Nginx
例如用 GitHub Actions + SSH:
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_KEY }}
script: |
cd /var/www/project
git pull origin main
composer install --no-dev --optimize-autoloader
sudo systemctl reload php-fpm优点
-
不再人工 FTP
-
有部署日志
-
权限可控
-
可以加测试、审批、通知
-
适合团队协作
问题
如果只是 git pull 覆盖线上目录,仍然存在短暂不一致风险。
方案 3:Release 目录 + 软链接切换,强烈推荐
这是不上容器时比较稳的 PHP 部署方式。
目录结构
/var/www/project/
releases/
20260615120000/
20260615123000/
shared/
.env
storage/
uploads/
current -> /var/www/project/releases/20260615123000Nginx 指向:
root /var/www/project/current/public;部署流程
每次发布新建一个 release 目录:
RELEASE=/var/www/project/releases/$(date +%Y%m%d%H%M%S)
git clone git@github.com:xxx/project.git $RELEASE
cd$RELEASE
composer install --no-dev--optimize-autoloader
ln-s /var/www/project/shared/.env $RELEASE/.env
ln-s /var/www/project/shared/storage $RELEASE/storage
ln-sfn$RELEASE /var/www/project/current
sudo systemctl reload php-fpm回滚
只需要把 current 指回上一个 release:
ln-sfn /var/www/project/releases/20260615120000 /var/www/project/current
sudo systemctl reload php-fpm优点
-
发布接近原子切换
-
回滚很快
-
不会出现 FTP 那种文件传一半线上就混乱的问题
-
很适合 PHP-FPM + Nginx 架构
这个是我最推荐的非容器方案。
可以直接用的工具
如果不想自己写部署脚本,可以看这些:
| 工具 | 适合场景 |
|---|---|
| Deployer | PHP 项目非常适合,支持 release、shared、rollback |
| Capistrano | Ruby 生态老牌部署工具,也可部署 PHP |
| Ansible | 多服务器、配置管理、发布流程统一 |
| Jenkins/GitLab CI | 公司内部规范 CI/CD |
| GitHub Actions | 轻量、成本低、上手快 |
其中 Deployer 很适合 PHP:
composer require deployer/deployer --dev
vendor/bin/dep init
vendor/bin/dep deploy production它天然支持:
-
releases
-
shared files
-
symlink
-
rollback
-
composer install
-
deploy hooks
我的建议
你们现在是 FTP 替换,建议按这个路线走:
第一阶段:马上替换 FTP
用:
Git + SSH 部署脚本
目标是先解决:
-
文件不可追踪
-
人工替换容易漏文件
-
无部署日志
-
回滚困难
第二阶段:标准化发布
升级成:
CI/CD + releases 目录 + current 软链接
这是不上容器时的主力方案。
第三阶段:补齐工程规范
增加:
-
Git 分支策略:
dev / staging / main -
测试环境自动部署
-
线上发布需要 tag 或手动审批
-
部署前自动备份
-
数据库 migration 谨慎执行
-
发布失败自动回滚
-
发布通知到 Slack / 飞书 / 企业微信
注意几个坑
1. 不要把用户上传文件放在代码目录里
比如:
public/uploads
storage
runtime这些应该放到 shared,然后软链接进 release。
否则每次发版可能覆盖或丢失用户文件。
2. .env 不进 Git
线上配置应该在服务器的 shared/.env。
代码发布时软链接进去。
3. Composer 不建议在线上临时慢慢装
更稳的方式是 CI 阶段装好依赖、打包上传。
如果项目不大,也可以先在线上执行:
composer install --no-dev--optimize-autoloader但要注意 composer 版本、PHP 扩展、网络稳定性。
4. 数据库变更要单独谨慎处理
代码回滚容易,数据库回滚不一定容易。
建议:
-
migration 向前兼容
-
大字段变更提前做
-
删除字段延后
-
关键发布前备份数据库
结论
不上容器,最推荐:
GitLab CI / GitHub Actions + SSH + Deployer / Release 软链接部署
这是比 FTP 稳定很多、成本又不高的方案。
如果你们当前技术债不重,可以直接上 Deployer;如果团队想完全可控,就自己写 release 部署脚本。