GRPC PHP客户端实现教程
依赖工具
本demo要实现的是通过php-fpm(非cli)调用grpc与远程服务进行交互。
- nginx 1.8.0+
- gcc 4.8+
- php5.6+
- grpc c library
- protoc
- php grpc extension
grpc使用方法
使用命令: 使用下面这个命令生成客户端存根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协议文件
使用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.org/installer | sudo php $ php composer.phar install
代码中require autoload.php即可使用
工具安装(方法1)
安装gcc 4.8
$ cd /tmp $ wget http://gcc.skazkaforyou.com/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目录下
grpc c library安装
$ cd /usr/local $ git clone -b $(curl -L https://grpc.io/release) https://github.com/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.org/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.org/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
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
protoc 编译器安装
$ cd /tmp $ wget https://github.com/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目录下
所有预装软件安装升级完成后,删除源码(可选)
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*
安装升级过程中可能出现的问题
/lib64/libstdc++.so.x: version: `GLIBCXX_X.X.XX’ not found
提示你cmake时libstdc++.so.x中缺少GLIBCXX_X.X.XX或更高版本
解决办法: (这libstdc++.so.x中的x根据是数字)- 先确保所有旧版本gcc、cc、g++已被全部替换,再重新执行编译安装,如果仍然提示该错误,请执行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)
一次性安装所有依赖包:
$ 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
安装PHP5.6(可选,如果服务器上还未装的话)
下载地址: http://php.net/downloads.php
$ wget http://php.net/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环境变量
直接升级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
安装grpc c library
$ git clone --recursive -b v1.3.x https://github.com/grpc/grpc $ cd grpc $ make -j8 $ make install
php extension 安装
$ cd /usr/local/grpc/src/php/ext/grpc $ phpize $ ./configure $ make -j8 $ make install
在php.ini中加入: extension=grpc.so
参考文献
- https://github.com/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.com/stephenturner/e3bc5cfacc2dc67eca8b
- https://github.com/grpc/grpc/tree/master/src/php
- https://github.com/grpc/grpc/blob/master/src/core/lib/support/env_linux.c
- http://doc.oschina.net/grpc?t=58008#quickstart
- http://www.jianshu.com/p/fa126a8535a0
- http://blog.csdn.net/u012580566/article/details/53515938
- http://blog.csdn.net/zimiao815/article/details/51242814