# php-grpc
**Repository Path**: chenbool/php-grpc
## Basic Information
- **Project Name**: php-grpc
- **Description**: php-grpc
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-09
- **Last Updated**: 2026-05-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Go + PHP gRPC 微服务项目
使用 Go 实现 gRPC 服务端,PHP 作为客户端的微服务示例项目。
## 项目架构
```mermaid
graph TB
subgraph "PHP 客户端"
PHP[index.php
PHP gRPC Client]
end
subgraph "网络层"
HTTP[HTTP/2
Protocol]
end
subgraph "Go 服务端"
GRPC[gRPC Server
Port 8080]
ZRPC[go-zero
zrpc]
LOGIC[业务逻辑
UserInfo/UserCreate]
end
PHP -->|gRPC 调用| HTTP
HTTP -->|请求| GRPC
GRPC --> ZRPC
ZRPC --> LOGIC
```
## 通信流程
```
┌─────────────┐ HTTP/2 ┌─────────────┐
│ PHP Client │ ═══════════► │ Go Server │
│ │ gRPC请求 │ gRPC:8080 │
│ index.php │ │ │
└─────────────┘ └─────────────┘
│ │
│ 1. 创建 Channel │ 1. 启动服务
│ 2. 构建 Request │ 2. 注册服务
│ 3. 序列化(Protobuf) │ 3. 反序列化
│ 4. HTTP/2 发送 │ 4. 执行业务逻辑
│ 5. 接收 Response │ 5. 序列化返回
│ 6. 反序列化 │ 6. HTTP/2 响应
│ │
└────────◄──────────────────────┘
```
## 目录结构
```
f:\code\php\user\
│
├── 📁 rpc/ # Go gRPC 服务端
│ ├── 📄 user.go # 服务入口
│ ├── 📄 user.proto # Protobuf 定义
│ ├── 📄 go.mod # Go 依赖管理
│ ├── 📄 go.sum # 依赖校验
│ ├── 📄 readme.md # 服务端文档
│ │
│ ├── 📁 etc/ # 配置文件
│ │ └── 📄 user.yaml # 服务配置
│ │
│ ├── 📁 internal/ # 内部实现
│ │ ├── 📁 config/ # 配置定义
│ │ ├── 📁 logic/ # 业务逻辑
│ │ │ ├── 📄 userinfologic.go
│ │ │ └── 📄 usercreatelogic.go
│ │ ├── 📁 server/ # gRPC 服务注册
│ │ └── 📁 svc/ # 服务上下文
│ │
│ ├── 📁 types/user/ # 生成的 Go 代码
│ │ ├── 📄 user.pb.go # Protobuf 消息
│ │ └── 📄 user_grpc.pb.go # gRPC 服务接口
│ │
│ └── 📁 users/ # 服务实现
│ └── 📄 users.go
│
├── 📁 php-grpc/ # PHP gRPC 客户端
│ ├── 📄 index.php # 客户端入口
│ ├── 📄 composer.json # Composer 配置
│ ├── 📄 composer.lock # 依赖锁定
│ ├── 📄 readme.md # 客户端文档
│ │
│ ├── 📁 generated/ # protoc 生成的 PHP 类
│ │ ├── 📁 GPBMetadata/
│ │ │ └── 📄 User.php
│ │ └── 📁 User/
│ │ ├── 📄 UserInfoRequest.php
│ │ ├── 📄 UserInfoResponse.php
│ │ ├── 📄 UserCreateRequest.php
│ │ └── 📄 UserCreateResponse.php
│ │
│ └── 📁 vendor/ # Composer 依赖
│ ├── 📁 google/protobuf/# Protobuf 库
│ └── 📁 grpc/grpc/ # gRPC 库
│
├── 📁 protoc-33.0-win64/ # Protobuf 编译器
│ └── 📁 bin/
│ └── 📄 protoc.exe # 代码生成工具
│
└── 📄 readme.md # 项目总览
```
## 技术栈
| 角色 | 技术 | 版本 | 说明 |
|------|------|------|------|
| 服务端 | Go + go-zero | 1.22+ | 微服务框架 |
| 通信协议 | gRPC + Protobuf | HTTP/2 | 高性能 RPC |
| 客户端 | PHP + gRPC 扩展 | 8.2+ | 客户端调用 |
| 代码生成 | protoc | 33.0 | Protobuf 编译器 |
## 服务接口
### UserInfo - 获取用户信息
| 方向 | 字段 | 类型 | 说明 |
|:----:|------|------|------|
| ► 请求 | user_id | uint32 | 用户 ID |
| ◄ 响应 | user_id | uint32 | 用户 ID |
| ◄ 响应 | username | string | 用户名 |
### UserCreate - 创建用户
| 方向 | 字段 | 类型 | 说明 |
|:----:|------|------|------|
| ► 请求 | username | string | 用户名 |
| ► 请求 | password | string | 密码 |
| ◄ 响应 | - | 空消息 | 操作结果 |
## 快速开始
### 1. 启动 Go gRPC 服务
```bash
cd rpc
go run user.go
```
```
输出: Starting rpc server at 127.0.0.1:8080...
```
### 2. 运行 PHP 客户端
```bash
cd php-grpc
php index.php
```
### 3. 预期输出
```
=== PHP gRPC 客户端测试 ===
=== 调用 UserInfo 方法 ===
UserId: 1
Username: 薯片
=== 调用 UserCreate 方法 ===
User created successfully!
=== 测试完成 ===
```
## 核心代码
### Protobuf 定义 (user.proto)
```protobuf
syntax = "proto3";
package user;
// 用户服务
service Users {
// 获取用户信息
rpc UserInfo(UserInfoRequest) returns(UserInfoResponse);
// 创建用户
rpc UserCreate(UserCreateRequest) returns(UserCreateResponse);
}
message UserInfoRequest {
uint32 user_id = 1;
}
message UserInfoResponse {
uint32 user_id = 1;
string username = 2;
}
message UserCreateRequest {
string username = 1;
string password = 2;
}
message UserCreateResponse {
}
```
### PHP 客户端调用
```php
\Grpc\ChannelCredentials::createInsecure(),
]);
// 2. 创建客户端
$client = new UserClient('127.0.0.1:8080', [], $channel);
// 3. 构建请求
$request = new \User\UserInfoRequest();
$request->setUserId(1);
// 4. 发起调用
list($response, $status) = $client->UserInfo($request)->wait();
// 5. 处理响应
if ($status->code === 0) {
echo "UserId: " . $response->getUserId();
echo "Username: " . $response->getUsername();
}
// 6. 关闭通道
$channel->close();
```
### Go 服务端实现
```go
// 实现 Users 服务接口
type UsersServer struct {
user.UnimplementedUsersServer
svcCtx *svc.ServiceContext
}
func (s *UsersServer) UserInfo(ctx context.Context, req *user.UserInfoRequest) (*user.UserInfoResponse, error) {
l := logic.NewUserInfoLogic(ctx, s.svcCtx)
return l.UserInfo(req)
}
```
## 数据流转
```
PHP 客户端 Go 服务端
────────── ──────────
│ │
│ 1. 调用 setUserId(1) │
│ 2. 序列化为 Protobuf │
│ 3. HTTP/2 发送 ───────────► │
│ │ 4. 接收并反序列化
│ │ 5. 执行 UserInfo 逻辑
│ │ 6. 查询用户数据
│ │ 7. 构建响应
│ │ 8. 序列化为 Protobuf
│ 9. 接收响应 ◄───────────── │
│ 10. 反序列化 │
│ 11. 调用 getUsername() │
│ │
```
## 注意事项
| 事项 | 建议 |
|------|------|
| 生产环境 | 使用 `createSsl()` 替代 `createInsecure()` |
| 超时设置 | 添加 `'timeout' => 30` 参数 |
| proto 更新 | 重新执行 `protoc --php_out=generated ...` |
| 错误处理 | 检查 `$status->code` 是否为 0 |
## 相关文档
| 文档 | 说明 |
|------|------|
| [php-grpc/readme.md](./php-grpc/readme.md) | PHP 客户端详细文档 |
| [rpc/readme.md](./rpc/readme.md) | Go 服务端详细文档 |
---
**仓库地址**: https://gitee.com/chenbool/php-grpc