分享下我學習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!