PHP 怎么声明式部署

wen PHP项目 1

本文目录导读:

PHP 怎么声明式部署

  1. 方案一:基于 Git + 自动化脚本(半声明式)
  2. 方案二:使用基础设施即代码(IaC)工具——混合技术栈
  3. 方案三:使用容器化(Docker Compose + Kubernetes)
  4. 总结: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 或修改配置文件引起的环境漂移问题。

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