PHP 怎么用Envoy

wen PHP项目 3

本文目录导读:

PHP 怎么用Envoy

  1. Laravel Envoy(任务部署工具)
  2. Envoy Proxy(服务代理)
  3. 实际部署示例
  4. 注意事项

在 PHP 中使用 Envoy 主要有两种方式:

Laravel Envoy(任务部署工具)

这是最常用的方式,用于远程服务器部署和任务执行。

安装

composer global require laravel/envoy

基础使用

创建 Envoy.blade.php 文件:

@servers(['web' => 'user@192.168.1.1', 'db' => 'root@192.168.1.2'])
@task('deploy', ['on' => 'web'])
    cd /var/www/html
    git pull origin master
    composer install --no-dev
    php artisan migrate --force
@endtask
@task('restart-nginx', ['on' => 'web'])
    sudo service nginx restart
@endtask
@task('backup-db', ['on' => 'db'])
    mysqldump -u root mydatabase > /tmp/backup.sql
@endtask

执行任务

# 执行单个任务
envoy run deploy
# 执行多个任务
envoy run deploy && envoy run restart-nginx
# 执行带参数的任务
envoy run deploy --branch=main

高级功能

@servers(['web' => ['user@host1', 'user@host2']])
@setup
    $branch = isset($branch) ? $branch : 'main';
    $path = '/var/www/html';
@endsetup
@task('deploy', ['on' => 'web'])
    cd {{ $path }}
    git fetch origin
    git checkout {{ $branch }}
    git pull origin {{ $branch }}
@endtask
@story('deploy-all')
    deploy
    restart-nginx
    clear-cache
@endstory
@task('clear-cache')
    php artisan cache:clear
    php artisan view:clear
@endtask
@finished
    echo "部署完成!";
@endfinished

Envoy Proxy(服务代理)

如果你的意思是使用 Envoy Proxy(Lyft 的服务代理),那么需要通过 PHP 调用管理 API 或使用控制平面。

使用 PHP 管理 Envoy

<?php
class EnvoyManager {
    private $apiUrl;
    private $username;
    private $password;
    public function __construct($apiUrl, $username, $password) {
        $this->apiUrl = $apiUrl;
        $this->username = $username;
        $this->password = $password;
    }
    public function getConfig() {
        $ch = curl_init($this->apiUrl . '/config');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERPWD, "{$this->username}:{$this->password}");
        $response = curl_exec($ch);
        curl_close($ch);
        return json_decode($response, true);
    }
}

实际部署示例

这是一个完整的部署脚本示例:

// Envoy.blade.php
@servers(['production' => 'deployer@server.com'])
@setup
    $app = 'my-application';
    $repo = 'https://github.com/yourname/'.$app.'.git';
    $releases_dir = '/var/www/'.$app.'/releases';
    $current_dir = '/var/www/'.$app.'/current';
    $release = date('YmdHis');
    $new_release_dir = $releases_dir.'/'.$release;
@endsetup
@task('deploy', ['on' => 'production'])
    echo "开始部署 {{ $app }}..."
    # 创建新的 release 目录
    mkdir -p {{ $new_release_dir }}
    # 克隆代码
    git clone --depth 1 {{ $repo }} {{ $new_release_dir }}
    # 安装依赖
    cd {{ $new_release_dir }}
    composer install --no-dev --prefer-dist
    # 创建 .env 文件
    cp {{ $current_dir }}/.env {{ $new_release_dir }}/.env
    # 运行数据库迁移
    php artisan migrate --force
    # 创建符号链接
    ln -nfs {{ $new_release_dir }} {{ $current_dir }}
    # 清理旧的 releases(保留最近 5 个)
    ls -dt {{ $releases_dir }}/* | tail -n +6 | xargs rm -rf
    echo "部署完成!"
@endtask
@story('deploy-all')
    deploy
@endstory

执行部署

# 执行部署
envoy run deploy
# 带参数执行
envoy run deploy --branch=main --env=production
# 查看所有可用任务
envoy list

注意事项

  • 权限问题:确保 SSH 密钥配置正确
  • 环境变量:使用 @setup 块定义变量
  • 多环境:可以通过参数区分不同环境
  • 错误处理:使用 @error 指令处理错误
@task('deploy', ['on' => 'production'])
    @error
        echo "部署失败,正在回滚...";
        ln -nfs {{ $old_release_dir }} {{ $current_dir }}
    @enderror
    // 部署代码
@endtask

根据你的具体需求选择相应的使用方式,如果是做部署自动化,推荐使用 Laravel Envoy;如果是服务网格/代理场景,则需要集成 Envoy Proxy 的 API。

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