专栏首页喵了个咪的博客空间Grpc介绍 — Go-Service To PHP-Client

Grpc介绍 — Go-Service To PHP-Client

笔者现在公司项目大部分是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 用来生成文件

1、先编译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_plugin  helloworld.proto
> cd php-client/helloworld/
> ll
total 0
drwxr-xr-x  4 wenzhenxi  staff  128  2 15 15:09 ./
drwxr-xr-x  3 wenzhenxi  staff   96  2 15 15:09 ../
drwxr-xr-x  3 wenzhenxi  staff   96  2 15 15:09 GPBMetadata/
drwxr-xr-x  5 wenzhenxi  staff  160  2 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.php

require '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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • phalcon-入门篇2(HelloWord与PhalconTools)

    #phalcon-入门篇2(HelloWord与PhalconTools)# ? 本教程基于phalcon2.0.9版本 ##前言## 先在这里感谢各位phal...

    喵了个咪233
  • phalapi-入门篇4(国际化高可用和自动生成文档)

    phalapi-入门篇4(国际化高可用和自动生成文档) ? 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 在...

    喵了个咪233
  • zephir-(11)流程控制语句

    #zephir-流程控制语句# ? ##前言## 先在这里感谢各位zephir开源技术提供者 ZEPHIR实现了一个简化的控制结构语句,类似的语言如C,PHP等...

    喵了个咪233
  • get_cfg_var 函数使用

    参考:http://php.net/manual/zh/function.get-cfg-var.php 从php.ini配置文件获取信息 比如php.ini设...

    苦咖啡
  • CentOS的SVN服务器搭建和自动部署

    xferris
  • 在 Quora 做机器学习「炼丹」是怎样的体验?

    AI 科技评论按:实际上,号称「美版知乎」的 Quora 也已经大量引入了机器学习技术,而 Quora 的工程师们则喜欢把自己研究机器学习、产出技术方案的过程...

    AI研习社
  • wordpress调用自定义post_type文章

      前面我们讲了wordpress添加post_type自定义文章类型,我们现在来讲一下如何把自定义文章调用出来,我们以product为例,虽然我们自定义好了 ...

    ytkah
  • 分享一种不太完美的接入网关设计

    ? 作者:朱江,腾讯工程师。 写在前面: ? 如上图所示,客户端通过HTTP+JSON协议请求ProxyServer,由其派发到后端不同服务的不同接口处理,从...

    腾讯大讲堂
  • Android NDK OpenCV级联方式实时进行人脸检测

    前面的文章《Android通过OpenCV和TesserartOCR实时进行识别》我们已经搭好一个利用NDK方式实时处理摄像头数据的程序了,今天我们就在看看Op...

    Vaccae
  • linux基础(day 33)

    10.11 Linux网络相关 linux网络相关 ifconfig命令,可以查看虚拟网卡,而ip addr命令则不能查看 ifconfig查看网卡ip(yum...

    运维小白

扫码关注云+社区

领取腾讯云代金券