内容简介:紧接上一篇,下面用 PHP 作为客户端调用 golang 的服务端。如果要和世界上最好的语言
紧接上一篇,下面用 PHP 作为客户端调用 golang 的服务端。
安装 grpc_go_plugin 插件
grpc_php_plugin
插件可以帮助我们自动生成 client stub
类库(相当于 API
文件),方便我们直接引入调用,否则只生成服务/请求/响应的实体类,用起来不太方便。
# 下载 grpc 的库到本地 cd ~ && git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc # 更新子模块依赖 cd grpc && git submodule update --init # 这里我们只编译 php 的插件 如果要编译所有的 make && make install make grpc_php_plugin # 插件路径 ll ./bins/opt/grpc_php_plugin
生成PHP客户端
如果要和世界上最好的语言 PHP
结合使用的话( PHP
只能做 C
端)只需要安装 grpc
和 protobuf
扩展,生成 PHP
版的库即可。
###生成php客户端库 #不会有 client stub 类 protoc -I. --php_out=plugins=grpc:./user user.proto # 会有 client stub 类 protoc -I. \ --php_out=./user \ --grpc_out=./user \ --plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin \ user.proto # 查看生成的服务类库 [root@localhost grpc]# tree user user ├── GPBMetadata │ └── User.php ├── User │ ├── UserClient.php │ ├── UserDeleteRequest.php │ ├── UserDeleteResponse.php │ ├── UserEntity.php │ ├── UserIndexRequest.php │ ├── UserIndexResponse.php │ ├── UserPostRequest.php │ ├── UserPostResponse.php │ ├── UserViewRequest.php │ └── UserViewResponse.php └── user.pb.go
PHP GRPC 扩展及依赖安装
#安装扩展 pecl install grpc pecl install protobuf
使用 composer
管理依赖加载。
mkdir grpc-php-client && cd grpc-php-client
# 使用 composer 管理项目
composer init
# 安装 grpc/protobuf 的客户端库文件
composer require grpc/grpc
composer require google/protobuf
# 新建 grpc 服务库目录 将生成的PHP客户端文件移动至此
mkdir grpc && mv $GOPATH/src/grpc/user/* ./grpc
# 注册 psr4 自动加载服务的客户端文件
vi composer.json
{
"name": "root/php-client",
"require": {
"grpc/grpc": "^1.19",
"google/protobuf": "^3.7"
},
"autoload": {
"psr-4": {
"User\\": "./grpc/User/",
"GPBMetadata\\": "./grpc/GPBMetadata/"
}
}
}
# 更新 composer 加载器
composer dump-autoload
PHP客户端代码实例
在安装完 php
的 grpc
扩展和依赖库后,我们就可以编写代码了。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use User\UserClient;
use User\UserEntity;
use User\UserIndexRequest;
use User\UserIndexResponse;
use User\UserViewRequest;
use User\UserViewResponse;
use User\UserPostRequest;
use User\UserPostResponse;
use User\UserDeleteRequest;
use User\UserDeleteResponse;
// 创建客户端实例
$userClient = new UserClient('10.10.31.211:50051', [
'credentials' => Grpc\ChannelCredentials::createInsecure()
]);
$userIndexRequest = new UserIndexRequest();
$userIndexRequest->setPage(1);
$userIndexRequest->setPageSize(12);
// 发送请求 返回的是一个数组 [服务接口对应的响应对象, 请求状态对象]
list($userIndexResponse, $statusObj) = $userClient->UserIndex($userIndexRequest)->wait();
if (0 != $statusObj->code) {
throw new \Exception($statusObj->details, $statusObj->code);
}
echo printf("index request end: err %d msg %s" . PHP_EOL, $userIndexResponse->getErr(), $userIndexResponse->getMsg());
/* @var [UserEntity, UserEntity] */
$data = $userIndexResponse->getData();
foreach ($data as $row) {
echo $row->getName(), $row->getAge() . PHP_EOL;
}
// 剩余的就不写了 都很简单的
// $userClient->UserView();
// $userClient->UserPost();
// $userClient->UserDelete();
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Code Reading
Diomidis Spinellis / Addison-Wesley Professional / 2003-06-06 / USD 64.99
This book is a unique and essential reference that focuses upon the reading and comprehension of existing software code. While code reading is an important task faced by the vast majority of students,......一起来看看 《Code Reading》 这本书的介绍吧!