1. protoc 生成php代码命令?
1. 首先在 demo2 文件夹下创建 helloGo文件夹,可自定义
2. 使用生成命令
protoc --php_out=./helloPhp ./hello.proto
此时查看文件夹下是否多了此类文件
demo2\helloPhp\GPBMetadata\Hello.php
demo2\helloPhp\Hello\Requests.php
demo2\helloPhp\Hello\Responses.php
2. composer安装所需组件?
1. demo2下创建 composer.json 内容如下 demo2\helloPhp\composer.json
{
"name": "grpc/go-php-test",
"require": {
"grpc/grpc": "^v1.3.0",
"google/protobuf": "^v3.3.0"
},
"autoload":{
"psr-4":{
"GPBMetadata\\":"GPBMetadata/",
"Hello\\":"Hello/"
}
}
}
2. 运行 composer install 生成 vendor 和 composer.lock
demo2\helloPhp\vendor\autoload.php
demo2\helloPhp\composer.lock
3. 创建 demo2/php_server/serve.php
composer install
<?php
require_once __DIR__ . '../../helloPhp/vendor/autoload.php';
/**
* 创建 client 类 实现客户端
*/
class HelloClient extends \Grpc\BaseStub{
public function __construct($hostname, $opts, $channel = null) {
parent::__construct($hostname, $opts, $channel);
}
/**
* rpc Run(Requests) returns (Responses) {}
* 用于请求和响应该服务
* @param Requests ...
* @param metadata ...
* @param options ...
*/
public function Run(\Hello\Requests $Requests, $metadata=[], $options=[]) {
// (/Hello.Hello/Run) 是请求服务端那个服务和方法,基本和 proto 文件定义一样
// (\Hello\Responses) 是服务端响应信息
return $this->_simpleRequest('/hello.Hello/Run',
$Requests,
['\Hello\Responses', 'decode'],
$metadata, $options);
}
public function getMessage() {
return $this->message;
}
}
// 客户端监听端口
$client = new HelloClient('127.0.0.1:1234', [
'credentials' => Grpc\ChannelCredentials::createInsecure()
]);
//实例化 Requests 数据类 ,rpc Run(Requests) 类的入参
$request = new \Hello\Requests();
$request->setName("小Q");
/**
* @param result 响应对象 (Hello\Responses)
* @param status ...
*/
list($result, $status) = $client->Run($request)->wait();
echo $result->getMessage();
4. 运行 serve.php, 服务端接收 "小Q",服务端返回 "hello小Q"
php demo2\php_server\serve.php
5. 出现此类报错 请安装 php_grpc扩展
Fatal error: Uncaught Error: Class 'Grpc\ChannelCredentials' not found
.https://pecl.php.net/package/gRPChttps://pecl.php.net/package/gRPC
6. 再次运行第4步
7.?success
|