gPRC在当下已经很流行了,特别是用Go写gPRC服务确实十分便捷。PHP也有需要作为客户端连接使用gRPC。为此,记录一下PHP适配gRPC服务的过程。
一、编译生成grpc_php_plugin
主要目的是用于生成PHP客户端代码。如果没有grpc_php_plugin,使用下面语句也能生成核心PHP代码。
protoc --php_out=. test.proto
但缺乏Client类实现,需要自己编写Client类。为方便,还是引入grpc_php_plugin吧。
git clone --recurse-submodules -b v1.50.0 --depth 1 --shallow-submodules
https://github.com/grpc/grpc
cd grpc
mkdir -p cmake/build
pushd cmake/build
cmake ../..
make protoc grpc_php_plugin
sudo cp grpc_php_plugin /usr/bin/
popd
上述指令先将grpc源代码及必要的子模块源码克隆到本地,然后编译生成grpc_php_plugin可执行程序。为方便使用,将生成的grpc_php_plugin拷贝到了 /usr/bin
二、生成PHP代码
现在可以根据proto文件生成PHP代码了。
protoc --php_out=. --grpc_out=. --plugin=protoc-gen-grpc=/usr/bin/grpc_php_plugin test.proto
运行上面的命令,就会生成两个子目录,一个为 GPBMetadata,这个目录名字是固定的,里面只有一个文件;另一个目录名字是proto里定义的package名(只不过把第一个字母变成大写了),这个目录里的文件有我们需要的TestClient.php。将这两个目录连同里面的文件拷贝到项目位置。
三、安装grpc for PHP
先安装PECL和Composer,如果都已经有了,这步就可以省略了
sudo apt-get install autoconf zlib1g-dev php-dev php-pear
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
再安装 gRPC 扩展程序
sudo pecl install grpc
sudo pecl install protobuf
然后在 php.ini 中增加下面两行,启用 gRPC 扩展程序
extension=grpc.so
extension=protobuf.so
四、配置项目
使用 composer 初始化项目,如果是已经存在的项目,就可以省略这个步骤。
composer init
安装 grpc/protobuf 的客户端库文件。
composer require grpc/grpc
composer require google/protobuf
然后编辑composer自动生成的composer.json,在”autoload” “psr-4” 下,增加两行,把刚才自动生成的两个目录加进去,
"autoload": {
"psr-4": {
... ....
"GPBMetadata\\": "./GPBMetadata/",
"Test\\":"./Test/"
... ...
}
},
然后重新加载一下配置
composer dump-autoload
五、编写程序
现在,就可以开始编写程序,使用TestClient.php 直接访问使用gRPC服务了。
对于普通的grpc服务,网上有很多例子,调用是简单的,只需使用ChannelCredentials的createInsecure函数
// 创建客户端实例
$testClient = new testClient('192.168.1.100:50051', [
'credentials' => Grpc\ChannelCredentials::createInsecure()
]);
对于使用单向TLS安全认证的gRPC服务,就需要使用createSsl函数(传入服务器的证书),并且还需要将参数grpc.ssl_target_name_override的值设置为 创建这个服务器证书时所使用的Common Name
// 创建客户端实例
$testClient = new testClient('192.168.1.100:50051', [
'grpc.ssl_target_name_override' => 'test.com',
'credentials' => Grpc\ChannelCredentials::createSsl(file_get_contents('../ssl/server.pem'))
]);
对于使用双向TLS安全认证的gRPC服务,调用createSsl 函数方式如下
// 创建客户端实例
$testClient = new testClient('192.168.1.100:50051', [
'grpc.ssl_target_name_override' => 'test.com',
'credentials' => Grpc\ChannelCredentials::createSsl(file_get_contents('../ssl/ca.pem'),file_get_contents('../ssl/client.key'),file_get_contents('../ssl/client.pem'))
]);
createSsl函数的的第一个参数为根证书,第二个参数为客户端私钥,第三个参数为客户端公钥证书。