本文目录导读:

在 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。