# 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