Hello Thrift

google了很多thrift的教程,但是都没有一个详细的hello 的demo。
最终自己慢慢摸索出来。
客户端用的php,服务器端用的pyhton,纪录下第一次使用thrift的全过程。
需要了解的知识:
1 composer自动价值类
2 php命名空间(类似java里面的package)
3 laravel

先贴代码:
thrift文件代码

namespace php zeu       
service HelloWorld {
    string sayHello()
}

服务器端代码:

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 leiminglin"
handler = HelloWorldHandler()
processor = HelloWorld.Processor(handler)
transport = TSocket.TServerSocket('127.0.0.1',12345)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
print "Starting python server"
server.serve()

客户端代码:

<?php
namespace App\Http\Controllers;
use App\Models\User;
use Thrift\Transport\TSocket;
use Thrift\Transport\TTransport;
use Thrift\Exception\TException;
use Thrift\Exception\TTransportException;
use Thrift\Factory\TStringFuncFactory;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TBufferedTransport;
use zeu\HelloWorldClient;
class UserController extends Controller {
    public function test(){
        $host = "127.0.0.1";
        $port = 12345;
        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";
        }   

    }
}

服务器文件和客户端文件目录位没有任何关系,不需要在同一个目录下面。

所以我对php文件放在我laravel框架里面,python文件放在~/cg/thriftTest目录下面。

服务器处的重点是找到thrift-0.9.*里面py目录下lib的目录,import进去。或者复制到当前目录下也可以。

客户端处的重点也是找到thrift-0.9.*里面py目录下lib的目录,import进去。或者复制到当前目录下也可以。

我都是复制的。

将thrift-0.9.*里面php目录下lib的目录,复制到laravel跟目录下面,文件名为thrift.

用composer自动加载

“autoload-dev”: {
“classmap”: [
“tests/TestCase.php”,
“app/http/controllers”,
“app/models”,
“Thrift”,
“cg/thrift/zeu”
]
},
composer dump-autoload –optimize 安装包的时候可以同样使用–optimize-autoloader。不加这一选项,你可能会发现20%到25%的性能损失。

从浏览器运行即可看到结果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章