资讯专栏INFORMATION COLUMN

thrift-101

Leck1e / 1098人阅读

摘要:此教程基于环境下载官网下那个安装包有诸多问题安装环境变量这一步很重要,用于系统寻找和安装依赖库安装需要版本以上依赖关系真是让人捉急啊安装

此教程基于 Linux CentOS 6.0, php 5.3X 环境

下载

</>复制代码

  1. git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift

</>复制代码

  1. PS:官网下那个安装包有诸多问题

安装

环境变量:

</>复制代码

  1. export PATH=$PATH:{php_src}/bin

这一步很重要,用于系统寻找 phpize 和 php-config

安装依赖库:

</>复制代码

  1. yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel openssl-devel

安装 autoconf (需要2.65版本以上):

</>复制代码

  1. wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
  2. tar
  3. tar xzvf autoconf-latest.tar.gz
  4. cd autoconf-xxx
  5. ./configure --prefix=/usr

libtool, autoconf, automake 依赖关系真是让人捉急啊...

安装 thrift:

</>复制代码

  1. ./bootstrap.sh
  2. ./configure --with-cpp --with-boost --without-python --without-csharp --without-java --without-erlang --without-perl --with-php --with-php_extension --without-ruby --without-haskell --without-go --without-d --without-nodjs --without-lua --without-openssl=/usr
  3. make && make install

检查工作:

查看PHP扩展安装目录中有 thrift_protocol.so 则 PHP 扩展安装成功

查看 /usr/local/include/thrift/c_glib 存在则C Library安装成功

查看 /usr/local/include/thrift/(server|protocol|...) 存在则C++ Library安装成功

修改 php.ini:

添加

</>复制代码

  1. extension="thrift_protocol.so"
Demo

创建 demo.thrift:

</>复制代码

  1. namespace cpp demo
  2. namespace php demo
  3. /*
  4. C like comments are supported
  5. */
  6. // This is also a valid comment
  7. typedef string my_string // We can use typedef to get pretty names for the types we are using
  8. service Demo
  9. {
  10. my_string hello(1:my_string thing),
  11. }

生成PHP客户端:

</>复制代码

  1. thrift --gen php demo.thrift

生成C++服务端:

</>复制代码

  1. thrift --gen cpp demo.thrift

会产生两个文件夹 gen-phpgen-cpp

编译服务端:

找到 libthrift-1.0.0-dev.so 的位置 (我机器上的位置在/usr/local/lib )

1) 在gen-cpp

创建服务端文件, 这里我复制了thrfit生成的skeleton文件

</>复制代码

  1. cp Demo_server.skeleton.cpp Demo_server.cpp

创建Makefile

</>复制代码

  1. GEN_SRC := Demo.cpp demo_php_constants.cpp demo_php_types.cpp
  2. GEN_OBJ := $(patsubst %.cpp,%.o, $(GEN_SRC))
  3. THRIFT_DIR := /usr/local/include/thrift
  4. BOOST_DIR := /usr/local/include
  5. INC := -I$(THRIFT_DIR) -I$(BOOST_DIR)
  6. .PHONY: all clean
  7. all: demo_server
  8. %.o: %.cpp
  9. $(CXX) -Wall $(INC) -c $< -o $@
  10. demo_server: Demo_server.o $(GEN_OBJ)
  11. $(CXX) -L/usr/local/lib -lthrift $^ -o $@
  12. clean:
  13. $(RM) *.o demo_server

添加 ld 路径: /etc/ld.so.conf.d 下创建 libthrift-x86_64.conf (名字可以自定义, 以.conf结尾就行) 文件, 添加路径/usr/local/lib.

make编译后在文件夹下会生成demo_server.

./demo_server启动服务端.

2) 在gen-php

{thrift_src}/lib/php/lib/Thrift文件夹复制到gen-php

demo文件下创建文client.php

</>复制代码

  1. register();
  2. $loader->registerNamespace("ThriftBase", dirname(dirname(__FILE__)));
  3. $loader->registerNamespace("ThriftType", dirname(dirname(__FILE__)));
  4. $loader->registerNamespace("ThriftException", dirname(dirname(__FILE__)));
  5. $loader->registerNamespace("ThriftTransport", dirname(dirname(__FILE__)));
  6. $loader->registerNamespace("ThriftProtocol", dirname(dirname(__FILE__)));
  7. $loader->registerNamespace("ThriftFactory", dirname(dirname(__FILE__)));
  8. $loader->registerNamespace("ThriftStringFunc", dirname(dirname(__FILE__)));
  9. $loader->registerNamespace("demo", dirname(dirname(__FILE__)));
  10. //TBase
  11. $loader->loadClass("TBase");
  12. //Type
  13. $loader->loadClass("TType");
  14. $loader->loadClass("TMessageType");
  15. //Transport
  16. $loader->loadClass("TSocket");
  17. $loader->loadClass("TBufferedTransport");
  18. //Protocol
  19. $loader->loadClass("TProtocol");
  20. $loader->loadClass("TBinaryProtocolAccelerated");
  21. //Factorys
  22. $loader->loadClass("TStringFuncFactory");
  23. //StringFunc
  24. $loader->loadClass("Core");
  25. //Exception
  26. $loader->loadClass("TException");
  27. $loader->loadClass("TProtocolException");
  28. $loader->loadClass("TApplicationException");
  29. try {
  30. $host = "127.0.0.1";
  31. $port = 9090;
  32. $socket = new TSocket($host ,$port);
  33. $transport = new TBufferedTransport($socket, 1024, 1024);
  34. $protocol = new TBinaryProtocolAccelerated($transport);
  35. $client = new DemoClient($protocol);
  36. $transport->open();
  37. $ret = $client->hello("Hello world!!");
  38. echo $ret;
  39. $transport->close();
  40. } catch (TException $e) {
  41. print "Something went wrong: " . $e->getMessage() . "
  42. ";
  43. }

执行:

</>复制代码

  1. php client.php

服务端显示:

</>复制代码

  1. hello

(全文完)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20743.html

相关文章

发表评论

0条评论

Leck1e

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<