您的位置:首页 > 编程语言 > Python开发

分享下我学习Thrift的入门例子helloworld,客户端用php,服务端用python:

2012-02-01 21:07 871 查看
分享下我学习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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: