GRPC PHP客户端实现教程

依赖工具

本demo要实现的是通过php-fpm(非cli)调用grpc与远程服务进行交互。

- nginx 1.8.0+
- gcc 4.8+
- php5.6+
- grpc c library
- protoc
- php grpc extension

grpc使用方法

  1. 使用命令: 使用下面这个命令生成客户端存根stub

    $ protoc --proto_path=./ --plugin=protoc-gen-grpc=/usr/local/grpc/bins/opt/grpc_php_plugin --php_out=./ --grpc_out=./ user.proto 
    • protoc: protoc编译器可执行文件的地址
    • –plugin: protoc-gen-grpc可执行文件的地址,该可执行文件在安装c library时会默认生成,位置是:/usr/local/grpc/bins/opt/grpc_php_plugin
    • –php_out: 指定类和文件生成
    • user.proto 自定义的protoc协议文件
  2. 使用composer安装插件

    $ vim composer.json
    
    { 
        "name": "grpc/grpc-dev", 
        "description": "gRPC library for PHP - for Developement use only", 
        "license": "BSD-3-Clause", 
        "version": "1.4.3", 
        "require": { 
            "php": ">=5.5.0", 
            "google/protobuf": "^v3.3.0" 
        }, 
        "require-dev": { 
            "google/auth": "v0.9" 
        }, 
        "autoload": { 
            "psr-4": { 
                "Grpc\\": "lib/Grpc/", 
                "GPBMetadata\\": "GPBMetadata/",
                "Ytzb\\Ytb\\Proto\\User\\": "Ytzb/Ytb/Proto/User/" //自动加载命令空间下的类
            } 
        } 
    }
    :wq
    $ curl -sS https://getcomposer/installer | sudo php 
    $ php composer.phar install
    
  3. 代码中require autoload.php即可使用

工具安装(方法1)

  1. 安装gcc 4.8

    $ cd /tmp 
    $ wget http://gcc.skazkaforyou/releases/gcc-4.8.2/gcc-4.8.2.tar.gz 
    $ tar -zxvf gcc-4.8.2.tar.gz 
    $ cd gcc-4.8.2 
    $ ./contrib/download_prerequisities 
    $ ./configure --prefix=/usr --enable-threads=posix --disable-checking --enable-languages=c,c++ --disable-multilib 
    $ make -j8 && sudo make install 
    $ ln -s 将可执行文件链接或拷贝到/usr/local/bin和/usr/bin目录下   
    • 检查安装是否成功: 安装位置的gcc -v, g++ -v
    • 安装参考:参考一、参考二
  2. grpc c library安装

    $ cd /usr/local
    $ git clone -b $(curl -L https://grpc.io/release) https://github/grpc/grpc
    $ cd /usr/local/grpc 
    $ git pull --recurse-submodules && git submodule update --init --recursive 
    $ make -j8 
    $ sudo make install 

    注:
    以上git命令需要git版本>=1.7.3,centOS yum安装的git低于该版本,如果服务器上未安装高版本git,请根据以下命令进行编译安装:

    $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc 
    $ yum install gcc perl-ExtUtils-MakeMaker 
    $ yum remove git (如果之前有默认安装了git,请移除) 
    $ cd /tmp/ 
    $ wget https://www.kernel/pub/software/scm/git/git-2.1.2.tar.gz 
    $ tar -zxvf git-2.1.2.tar.gz 
    $ cd git-2.1.2 
    $ make -j8 configure 
    $ ./configure --prefix=/usr/local/git --with-iconv=/usr/local/libiconv 
    $ make -j8 all doc 
    $ sudo make install install-doc install-html 

    检查是否安装成功:

    /usr/local/git/bin/git --version 

    安装成功后,将git可执行文件copy或者软链到 /usr/bin /usr/local/bin 两个目录下
    如果安装过程中提示libiconv不存在,请先安装libiconv,然后再make clean, make && sudo make install:

    $ cd /tmp 
    $ wget http://ftp.gnu/pub/gnu/libiconv/libiconv-1.14.tar.gz 
    $ tar -zxvf libiconv-1.14.tar.gz 
    $ cd libiconv-1.14 
    $ ./configure --prefix=/usr/local/libiconv 
    $ make -j8 && sudo make install 
  3. php grpc extension安装

    grpc依赖的c library安装完成后,安装php grpc扩展

    $ cd /usr/local/grpc/src/php/ext/grpc 
    $ phpize (若提示命令不存在,请全路径执行,即/usr/local/php/bin/phpize,取决于服务器php的安装路径) 
    $ ./configure --with-php-config=/usr/local/php/bin/php-config (php-config路径) 
    $ make -j8
    $ sudo make install 
    $ vim php.ini 加入extension=grpc.so 
    • 检测php grpc扩展是否安装成功 php –ri grpc 或者 php -m | grep grpc
    • php-fpm要使用grpc请重启nginx和php-fpm
    • 注: 命令行执行php文件提示Warning: insecure environment read function getenv used,请修改c文件/tmp/grpc/src/core/lib/support/env_linux.c
      注释掉相关的gpr_log,然后重新进入grpc目录更新c library,即make clean然后make && sudo make install
  4. protoc 编译器安装

    $ cd /tmp 
    $ wget https://github/google/protobuf/releases/download/v3.2.0/protobuf-php-3.2.0.tar.gz 
    $ tar -zxvf protobuf-php-3.2.0.tar.gz 
    $ cd protobuf-php-3.2.0 
    $ ./configure --prefix=/usr/local/protobuf 
    $ make -j8
    $ sudo make install 
    • 检测是否安装成功, /usr/local/protobuf/bin/protoc –version
    • 安装成功后,请将protoc可执行文件copy或者软链到/usr/local/bin和/usr/bin目录下
  5. 所有预装软件安装升级完成后,删除源码(可选)

    rm -rf /tmp/gcc-4.8.2* 
    rm -rf /tmp/git-2.1.2* 
    rm -rf /tmp/libiconv-1.14* 
    rm -rf /tmp/protobuf-php-3.2.0* 
  6. 安装升级过程中可能出现的问题

    • /lib64/libstdc++.so.x: version: `GLIBCXX_X.X.XX’ not found
      提示你cmake时libstdc++.so.x中缺少GLIBCXX_X.X.XX或更高版本
      解决办法: (这libstdc++.so.x中的x根据是数字)

      1. 先确保所有旧版本gcc、cc、g++已被全部替换,再重新执行编译安装,如果仍然提示该错误,请执行2解决
      2. 核实该文件中都有哪些版本,可以看出确实缺少了该版本
        strings /usr/lib64/libstdc++.so.x | grep GLIBCXX 

      查找新安装的gcc路径下是否有包含GLIBCXX_X.X.XX(gcc 4.8中肯定会包含的)

      strings /usr/local/lib64/libstdc++.so.x | grep GLIBCXX 

      看到该文件里确实包含了该版本,那么把这份文件软链到提示缺失的位置(包含新版本的该份文件可能与原文件不同名)

      cd /usr/lib64 
      mv libstdc++.so.x libstdc++.so.x.old 
      cp /usr/local/lib64/libstdc++.so.x.xx(新文件) /usr/lib64/ 
      ln -s libstdc++.so.x.xx(新文件) libstdc++.so.x
    • 安装各个软件过程中,如提示其他错误,缺失则安装,其他则请google或baidu解决。

工具安装(方法2)

  1. 一次性安装所有依赖包:

    $ yum install cmake sqlite-devel bzip2-devel libcurl-devel enchant-devel gmp-devel libicu-devel openldap-devel mysql-devel unixODBC-devel aspell-devel libedit-devel recode-devel net-snmp-devel libtidy-devel libxml2-devel pcre-devel libjpeg-devel libpng-devel libXpm-devel freetype-devel libxslt-devel gcc-c++ -y
  2. 安装PHP5.6(可选,如果服务器上还未装的话)

    下载地址: http://php/downloads.php

    $ wget http://php/downloads.php(对应版本的地址)
    $ ln -s /usr/lib64/mysql/libmysqlclient.so.16.0.0 /usr/lib/libmysqlclient.so(可选,软链一下mysql库)
    $ './configure' '--prefix=/usr/local/php' '--with-libxml-dir=/usr/lib' '--with-gd' '--with-zlib' '--with-mysql=/usr' '--enable-sockets' '--enable-mbstring' '--enable-safe-mode' '--enable-ftp' '--with-png' '--with-freetype-dir=/usr' '--with-jpeg' '--with-sqlite=shared' '--with-openssl'
    $ make -j8
    $ sudo make install
    $ vim /usr/local/php/bin 添加PATH环境变量
  3. 直接升级GCC到4.8

    $ wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
    $ yum install --nogpgcheck devtoolset-2
    $ scl enable devtoolset-2 bash
  4. 安装grpc c library

    $ git clone --recursive -b v1.3.x https://github/grpc/grpc
    $ cd grpc
    $ make -j8
    $ make install
  5. php extension 安装

    $ cd /usr/local/grpc/src/php/ext/grpc
    $ phpize
    $ ./configure
    $ make -j8
    $ make install

    在php.ini中加入: extension=grpc.so

参考文献

  • https://github/grpc/grpc/tree/master/src/php#generated-code-tests
  • http://www.grpc.io/docs/quickstart/php.html
  • http://www.grpc.io/docs/tutorials/basic/php.html
  • http://www.grpc.io/
  • https://gist.github/stephenturner/e3bc5cfacc2dc67eca8b
  • https://github/grpc/grpc/tree/master/src/php
  • https://github/grpc/grpc/blob/master/src/core/lib/support/env_linux.c
  • http://doc.oschina/grpc?t=58008#quickstart
  • http://www.jianshu/p/fa126a8535a0
  • http://blog.csdn/u012580566/article/details/53515938
  • http://blog.csdn/zimiao815/article/details/51242814

更多推荐

php使用grpc简单教程