Grpc介绍|Grpc介绍 — Go-Service To PHP-Client
2019独角兽企业重金招聘Python工程师标准>>>
文章图片
文章图片
笔者现在公司项目大部分是PHP进行开发,要完成整体微服务化必须要考虑PHP使用上的可行性,Grpc也是支持PHP作为client端发起Grpc请求,但是依赖的扩展等都相对复杂(毕竟不是亲儿子),那么本文就接受怎么使用PHP调用Grpc服务。
附上:
喵了个咪的博客:w-blog.cn
博文实例demo:GitHub - sunmi-OS/grpc-php-to-golang-demo
grpc官网:grpc / grpc.io
protobuf代码仓库:Releases · protocolbuffers/protobuf · GitHub
一,初始化PHP环境 PHP在使用过程中依赖一下几项内容
- grpc.so
- protobuf.so 或 composer依赖
- grpc_php_plugin 用来生成文件
> git clone https://github.com/grpc/grpc.git
> cd grpc
> git pull --recurse-submodules && git submodule update --init --recursive
> make
> sudo make install
# make install 会在 /usr/local/bin 目录下生成以下文件
#grpc_cpp_plugin
#grpc_csharp_plugin
#grpc_node_plugin
#grpc_objective_c_plugin
#grpc_php_plugin
#grpc_python_plugin
#grpc_ruby_plugin# 或者只变编译grpc_php_plugin
> make grpc_php_plugin
Package libcares was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcares.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcares' found
[C]Compiling third_party/address_sorting/address_sorting.c
[C]Compiling third_party/address_sorting/address_sorting_posix.c
[C]Compiling third_party/address_sorting/address_sorting_windows.c
[AR]Creating /Users/wenzhenxi/Downloads/grpc/libs/opt/libaddress_sorting.a
[HOSTCXX] Compiling src/compiler/cpp_generator.cc
[HOSTCXX] Compiling src/compiler/csharp_generator.cc
[HOSTCXX] Compiling src/compiler/node_generator.cc
[HOSTCXX] Compiling src/compiler/objective_c_generator.cc
[HOSTCXX] Compiling src/compiler/php_generator.cc
[HOSTCXX] Compiling src/compiler/python_generator.cc
[HOSTCXX] Compiling src/compiler/ruby_generator.cc
[AR]Creating /Users/wenzhenxi/Downloads/grpc/libs/opt/libgrpc_plugin_support.a
[HOSTCXX] Compiling src/compiler/php_plugin.cc
Package libcares was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcares.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcares' found
Package libcares was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcares.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcares' found
[HOSTLD]Linking /Users/wenzhenxi/Downloads/grpc/bins/opt/grpc_php_plugin
最终得到了grpc_php_plugin
2、安装PHP运行依赖
最简单的方式就是直接通过pecl进行安装:
pecl install grpc
pecl install protobuf
如果无法使用pecl可以使用编译的方式进行安装,PHP依赖的源文件已经存放在grpc中:
> cd grpc/src/php/ext/grpc
> phpize
> ./configure
> make
> sudo make install> git clone https://github.com/allegro/php-protobuf
> phpize
> ./configure
> make
> sudo make install
最后需要在php.ini里面增加如下内容:
extension=grpc.so
extension=protobuf.so
通过phpinfo(); 可以正常看到这两个模块正常即可
PS:protobuf可以不通过扩展的方式通过composer引入也可,对效率来说更加推荐通过SO扩展,demo中已经准备了7.1和7.2版本的so文件二,生成 PHP protobuf 文件
> cd $GOPATH/src/grpc-php-to-golang-demo/protobuf
> mkdir -p php-client/helloworld
> protoc --proto_path=./ --php_out=php-client/helloworld --grpc_out=php-client/helloworld --plugin=protoc-gen-grpc=../grpc_php_plugin-all/osx-64/grpc_php_pluginhelloworld.proto
> cd php-client/helloworld/
> ll
total 0
drwxr-xr-x4 wenzhenxistaff1282 15 15:09 ./
drwxr-xr-x3 wenzhenxistaff962 15 15:09 ../
drwxr-xr-x3 wenzhenxistaff962 15 15:09 GPBMetadata/
drwxr-xr-x5 wenzhenxistaff1602 15 15:09 Helloworld/
三,使用PHP调用go服务 拷贝依赖文件:
cd $GOPATH/src/grpc-php-to-golang-demo
mkdir -p php
cd php
mv $GOPATH/src/grpc-php-to-golang-demo/protobuf/php-client/helloworld helloworld
使用composer获取依赖文件:
> vim composer.json{
"name": "grpc/grpc-demo",
"description": "gRPC example for PHP",
"require": {
"grpc/grpc": "^v1.3.0"
},
"autoload": {
"psr-4": {
"": "route_guide/"
}
}
}>composer install
编写测试文件:
> vim client.phprequire 'vendor/autoload.php';
include_once 'helloworld/Helloworld/GreeterClient.php';
include_once 'helloworld/Helloworld/HelloReply.php';
include_once 'helloworld/Helloworld/HelloRequest.php';
include_once 'helloworld/GPBMetadata/Helloworld.php';
function greet($name)
{
$client = new Helloworld\GreeterClient('localhost:50051', [
'credentials' => Grpc\ChannelCredentials::createInsecure(),
]);
$request = new Helloworld\HelloRequest();
$request->setName($name);
list($reply, $status) = $client->SayHello($request)->wait();
$message = $reply->getMessage();
return $message;
}$name = !empty($argv[1]) ? $argv[1] : 'world';
echo greet($name)."\n";
结果:
> php client.php
holle world
【Grpc介绍|Grpc介绍 — Go-Service To PHP-Client】转载于:https://my.oschina.net/wenzhenxi/blog/3018601
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术