分享下我学习Thrift的入门例子helloworld,客户端用php,服务端用python:
架构图:
系统环境: Centos 5.6
一、安装Thrift
# yum -y install openssl-devel automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel
 # ./configure –with-php=/usr/local/server/php –with-cpp –with-boost –without-csharp –without-java –without-erlang –without-perl –without-ruby –without-haskell –without-go
 # make
 # make install
注意:
手动编译安装的语言包需要指定路径 –with-php=/usr/local/server/php;
需要php5.2++
 error:
 No route to host [113]
 检查防火墙是否封了端口
二、安装 Thrift PHP 扩展
# cd /usr/local/thrift/lib/php/src/ext/thrift_protocol
 # phpize
 # ./configure –enable-thrift_protocol
 注意:如果你的 PHP 没有安装到默认位置,则应该添加 –with-php-config=/(PHP 的 bin 目录)/php-config
 # make
 # make install
修改 php.ini,添加extension=thrift_protocol.so
三、安装 Python 模块
 cd lib/py
 python setup.py build
 python setup.py install
ImportError: No module named ttypes
 可能是模块名冲突
四、编写helloworld.thrift,根据IDL生成代码
service HelloWorld {
 string sayHello()
 }
为客户端生成代码:thrift –gen php helloworld.thrift
 为服务端生成代码:thrift –gen py helloworld.thrift
注意:server用php,生成的命令是 thrift –gen php:server helloworld.thrift
五、将生成的代码拷贝一份到客户端
 Note: You need to comment out the line “include_once $GLOBALS['THRIFT_ROOT'].’/packages/helloworld/helloworld_types.php’;” from file gen-php/helloworld/HelloWorld.php
六、编写服务脚步test.py,后台运行
#!/usr/bin/env python
import sys
 sys.path.append(‘../gen-py’)
from helloworld import HelloWorld
 from helloworld.ttypes import *
from thrift.transport import TSocket
 from thrift.transport import TTransport
 from thrift.protocol import TBinaryProtocol
 from thrift.server import TServer
import socket
class HelloWorldHandler:
 def __init__(self):
 self.log = {}
def sayHello(self):
 print “sayHello()”
 return “hello world ”
handler = HelloWorldHandler()
processor = HelloWorld.Processor(handler)
 transport = TSocket.TServerSocket(’127.0.0.1′,393939)
 tfactory = TTransport.TBufferedTransportFactory()
 pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
print “Starting python server…”
 server.serve()
# python test.py
七、编写客户端脚本test.php,测试
$GLOBALS['THRIFT_ROOT'] = '../thrift/';
require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php';
require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/THttpClient.php';
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php';
// Your gen-php dir
$GEN_DIR = '../gen-php';
require_once $GEN_DIR . '/helloworld/HelloWorld.php';
require_once $GEN_DIR . '/helloworld/helloworld_types.php';
// Set server host and port
$host = "127.0.0.1";
$port = 393939;
try {
//Thrift connection handling
$socket = new TSocket( $host , $port );
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = new TBinaryProtocol($transport);
// get our example client
$client = new HelloWorldClient($protocol);
$transport->open();
// Get current timestamp from server
$return = $client->sayHello();
echo $return;
$transport->close();
} catch (TException $tx) {
print 'Something went wrong: '.$tx->getMessage()."\n";
}
 
浏览器打开test.php,显示hello world!
                  
                  
                  
                  
本文详细介绍了如何使用Thrift在Centos5.6环境下,通过手动编译安装Thrift,安装ThriftPHP扩展及Python模块,编写helloworld.thrift接口文件并生成相应代码,实现PHP客户端与Python服务端之间的高效通信。最终通过测试脚本验证了跨语言通信的可行性。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					189
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            