PHPackages                             chenbool/etcd - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. chenbool/etcd

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

chenbool/etcd
=============

Etcd v3 PHP Client - Service registration and discovery

00PHP

Since May 9Pushed 1mo agoCompare

[ Source](https://github.com/chenbool/etcd-php)[ Packagist](https://packagist.org/packages/chenbool/etcd)[ RSS](/packages/chenbool-etcd/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependenciesVersions (1)Used By (0)

Etcd PHP Client
===============

[](#etcd-php-client)

> 基于 Etcd v3 HTTP API 的 PHP 客户端，提供服务注册、发现、KV 存储等功能

![PHP](https://camo.githubusercontent.com/c3362351d1264fd924675776c4f8307bf5f229fa15cbbd49d020909278dadb3a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d253345253344372e342d626c7565)![License](https://camo.githubusercontent.com/f8df3091bbe1149f398a5369b2c39e896766f9f6efba3477c63e9b4aa940ef14/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e)

目录
--

[](#目录)

- [特性](#%E7%89%B9%E6%80%A7)
- [安装](#%E5%AE%89%E8%A3%85)
- [快速开始](#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B)
- [配置](#%E9%85%8D%E7%BD%AE)
- [服务注册与发现](#%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0)
- [心跳与租约](#%E5%BF%83%E8%B7%B3%E4%B8%8E%E7%A7%9F%E7%BA%A6)
- [KV 存储](#kv-%E5%AD%98%E5%82%A8)
- [服务调用](#%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8)
- [工具方法](#%E5%B7%A5%E5%85%B7%E6%96%B9%E6%B3%95)
- [完整示例](#%E5%AE%8C%E6%95%B4%E7%A4%BA%E4%BE%8B)
- [API 参考](#api-%E5%8F%82%E8%80%83)

---

特性
--

[](#特性)

特性说明服务注册自动租约续期服务发现随机负载均衡KV 存储完整的 CRUD 操作心跳保活定时刷新租约健康检查Etcd 集群状态监控---

安装
--

[](#安装)

```
composer require guzzlehttp/guzzle
```

或直接引入：

```
require_once __DIR__ . '/extra/Etcd.php';
```

---

快速开始
----

[](#快速开始)

```
use extra\Etcd;

$etcd = new Etcd();

// 注册服务
$etcd->register('my-service', '127.0.0.1', 8080);

// 发现服务
$services = $etcd->discover('my-service');

// 注销服务
$etcd->deregister('my-service', '127.0.0.1', 8080);
```

---

配置
--

[](#配置)

### 构造函数

[](#构造函数)

```
$etcd = new Etcd(
    '127.0.0.1',  // host - Etcd 服务器地址
    2379,         // port - Etcd 端口
    '/services/', // prefix - 服务注册 key 前缀
    30            // ttl - 租约 TTL（秒）
);
```

### 环境变量

[](#环境变量)

> 构造函数参数支持环境变量覆盖

```
$etcd = new Etcd();
// 或通过环境变量: ETCD_HOST, ETCD_PORT, ETCD_PREFIX, ETCD_TTL
```

---

服务注册与发现
-------

[](#服务注册与发现)

### 注册服务

[](#注册服务)

```
$etcd = new Etcd();

// 基础注册
$etcd->register('user-api', '127.0.0.1', 8080);

// 带元数据
$etcd->register('user-api', '127.0.0.1', 8080, [
    'version' => '1.0.0',
    'region'  => 'cn-beijing'
]);

// 带回调
$etcd->registerWithCallback(
    'user-api', '127.0.0.1', 8080, [],
    fn() => print "OK\n",
    fn($e) => print $e->getMessage() . "\n"
);
```

### 发现服务

[](#发现服务)

```
// 发现指定服务
$services = $etcd->discover('user-api');
/*
返回:
[
    ['host' => '127.0.0.1', 'port' => 8080, 'metadata' => [...], 'registered_at' => '...'],
    ['host' => '127.0.0.1', 'port' => 8081, ...]
]
*/

// 发现所有服务
$allServices = $etcd->discoverAll();
/*
返回:
[
    'user-api'  => [...],
    'order-api' => [...]
]
*/
```

### 注销服务

[](#注销服务)

```
$etcd->deregister('user-api', '127.0.0.1', 8080);
```

---

心跳与租约
-----

[](#心跳与租约)

### 启动心跳

[](#启动心跳)

```
$services = [
    ['name' => 'user-api',  'host' => '127.0.0.1', 'port' => 8080],
    ['name' => 'order-api', 'host' => '127.0.0.1', 'port' => 8081],
];

// 每 25 秒重新注册
$etcd->heartbeat($services, 25, fn(string $name) => print "{$name} OK\n");
```

### 刷新租约

[](#刷新租约)

```
// 刷新单个租约
$etcd->refreshLease($leaseId);

// 刷新所有服务租约（每 60 秒）
$etcd->refreshAllServicesLease($services, 60);
```

---

KV 存储
-----

[](#kv-存储)

### 基础操作

[](#基础操作)

```
// 存储
$etcd->kvPut('/my/key', 'hello world');
$etcd->kvPut('/config/app', json_encode(['debug' => true]));
$etcd->kvPut('/temp/key', 'value', ['lease' => $leaseId]);

// 获取
$value = $etcd->get('/my/key');
$value = $etcd->get('/my/key', ['revision' => 10]);

// 删除
$etcd->del('/my/key');
$etcd->del('/prefix/', ['range_end' => '/prefix0']);
```

### 键操作

[](#键操作)

```
// 获取所有键
$keys = $etcd->getAllKeys();

// 前缀匹配
$keys = $etcd->getKeysWithPrefix('/services/');

// 压缩存储
$etcd->compaction(100);
```

---

服务调用
----

[](#服务调用)

```
// 字符串路径
$result = $etcd->call('user-api', '/api/user/1');

// 带参数
$result = $etcd->call('user-api', '/api/user', ['id' => 1]);

// Request 对象
$result = $etcd->call('user-api', $request, ['extra' => 'param']);

/*
成功返回:
{
    "success": true,
    "data": {
        "service": "user-api",
        "target": "127.0.0.1:8080",
        "response": {...}
    }
}

失败返回:
{
    "success": false,
    "error": "错误信息",
    "target": "127.0.0.1:8080"
}
*/
```

---

工具方法
----

[](#工具方法)

### 解析请求参数

[](#解析请求参数)

```
// 从 Request 对象解析
$parsed = Etcd::parseRequest($request);
// 返回 ['path' => '/xxx', 'data' => [...]]

// 从数组解析
$parsed = Etcd::parseRequest(['path' => '/api/user', 'data' => ['id' => 1]]);
```

### 健康检查

[](#健康检查)

```
if ($etcd->getServiceHealth()) {
    echo "Etcd 服务正常";
}
```

---

完整示例
----

[](#完整示例)

### Webman

[](#webman)

```
