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%的性能损失。
从浏览器运行即可看到结果。