本文目录导读:

- 方案一:基于 Git + 自动化脚本(半声明式)
- 方案二:使用基础设施即代码(IaC)工具——混合技术栈
- 方案三:使用容器化(Docker Compose + Kubernetes)
- 总结:PHP 部署的三种“声明”节点
PHP 的声明式部署通常指通过声明配置文件(而非手动操作)来定义服务器上应该存在的状态,然后通过自动化工具去执行代码使实际状态达到声明状态。
在 PHP 生态中,常见的声明式部署方式有几种,以下是主流的三种方案:
基于 Git + 自动化脚本(半声明式)
这种方式主要针对代码版本状态的声明,核心思路是“代码即声明”——声明目标环境应该对应哪个 Git 分支或 Tag。
核心思想:
在服务器上设定一个“部署清单”(如 deploy.php 或一个 shell 脚本),声明当前环境的目标版本和执行步骤,然后由命令行工具去执行。
示例(使用 Deployer 工具): Deployer 是 PHP 官方社区最流行的声明式部署工具(类似 PHP 世界的 Capistrano)。
// deploy.php
namespace Deployer;
// 声明目标服务器
host('production')
->set('hostname', 'your-server.com')
->set('user', 'deploy')
->set('deploy_path', '/var/www/myapp');
// 声明目标代码仓库(状态)
set('repository', 'git@github.com:your/repo.git');
set('branch', 'release/v1.0.0'); // 声明部署哪个分支
// 声明部署后的操作(声明“应该如何”)
task('deploy:custom', function () {
// 声明数据库迁移应处于最新状态
run('cd {{release_path}} && php artisan migrate --force');
});
// 声明完整的部署流程(按顺序组合任务)
task('deploy', [
'deploy:info',
'deploy:prepare',
'deploy:lock',
'deploy:release',
'deploy:update_code', // 确保代码是最新的
'deploy:shared',
'deploy:writable',
'deploy:vendors',
'deploy:custom', // 自定义状态声明
'deploy:clear_paths',
'deploy:symlink', // 确保软链接正确
'cleanup',
'success'
]);
// 声明完成部署后脚本
after('deploy', 'success');
运行方式:
vendor/bin/dep deploy production
使用基础设施即代码(IaC)工具——混合技术栈
如果PHP项目需要部署在云服务器(AWS、Azure 等)上,声明式部署通常是指环境的声明(服务器、数据库、负载均衡器等),PHP 代码只是其中的一部分。
PHP 开发者常用的组合是 Ansible 或 Terraform 与 PHP 部署脚本混合使用。
示例(Ansible Playbook 声明式):
deploy.yml 声明了整个服务器环境的状态(包、服务状态、PHP配置等):
- name: 部署 PHP 应用
hosts: webservers
vars:
php_version: "8.2"
app_repo: "git@github.com:your/repo.git"
tasks:
- name: 确保 PHP 扩展已安装(声明状态)
apt:
name:
- php{{ php_version }}-fpm
- php{{ php_version }}-mysql
state: present
- name: 确保 Web 目录存在
file:
path: /var/www/html
state: directory
- name: 确保代码从 Git 检出(声明当前版本状态)
git:
repo: "{{ app_repo }}"
version: "v1.1.0" # 声明目标版本
dest: /var/www/html
notify: restart php-fpm
handlers:
- name: restart php-fpm
service:
name: php{{ php_version }}-fpm
state: restarted
运行方式:
ansible-playbook -i hosts deploy.yml
这种方式完全声明了服务器的最终状态(包括PHP服务是否运行、代码版本、模块是否安装)。
使用容器化(Docker Compose + Kubernetes)
现代 PHP 部署越来越倾向于将整个运行环境打包成镜像,然后通过声明文件(YAML)来声明容器的组合状态。
这种方案是严格意义上的“声明式”,因为最终文件描述了系统应处于的完整状态。
示例(docker-compose.yml 声明 PHP 环境):
version: '3.8'
services:
php:
image: php:8.3-fpm
volumes:
- ./app:/var/www/html # 代码挂载
environment:
- APP_ENV=production
# 声明基于PHP镜像的扩展安装
build:
context: .
dockerfile: Dockerfile # Dockerfile中声明 php-ext install pdo_mysql
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./app:/var/www/html
depends_on:
- php
对于 Kubernetes(K8s),使用 Deployment 声明(声明每个 Pod 的镜像版本是指定的,且副本数为3):
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-app
spec:
replicas: 3 # 声明该副本数量
selector:
matchLabels:
app: php-app
template:
metadata:
labels:
app: php-app
spec:
containers:
- name: php-app
image: registry.mycompany.com/php-app:v1.2.3 # 声明镜像版本
ports:
- containerPort: 9000
运行方式:
docker compose up -d # 或 kubectl apply -f deploy.yaml
PHP 部署的三种“声明”节点
| 场景 | 声明的是什么 | 工具代表 |
|---|---|---|
| 代码版本 | 当前服务器应部署哪个 Git 分支/Tag | Deployer、Capistrano |
| 服务器状态 | 应该安装哪些软件包、服务是否启用、文件权限 | Ansible、Puppet |
| 容器编排 | 定义完整的应用堆栈(PHP版本、Nginx配置、依赖网络) | Docker Compose、Kubernetes |
最佳实践建议:
对于现代 PHP 项目,推荐采用 Docker(声明基础环境) + Deployer(声明代码部署) 的组合,如果项目较传统(使用宝塔或纯 LAMP),则使用 Ansible + Git 即可实现声明式部署,避免手动登录服务器执行 git pull 或修改配置文件引起的环境漂移问题。