moponphp / thrift
mopon泰久php项目组 thrift 通信类
1.1.4
2017-03-22 07:47 UTC
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2025-01-13 17:46:46 UTC
README
version 1.1.4 是个什么东西: thrift(http://thrift.apache.org/) 是由 Facebook 主导开发的一个跨平台、支持多语言的,通过定义 IDL (接口定义语言)文件,自动生成 RPC 客户端与服务端通信代码的工具,
类似的还有 : Protobuf和Avro http://blog.csdn.net/onlyforcloud/article/details/49589191 ,
http://baike.baidu.com/link?url=0apYi7T4riipmkdp4cCJU91zLfMsoLLTCpCfrMeIYgL5eUqfhgrVpyICrD9qaCqyPhG0RByvl_Ldm7wbyCbUlK
RPC : RPC(Remote Procedure Call Protocol)——远程过程调用协议
特点 : 其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势
协议 : http://elf8848.iteye.com/blog/1960131
Server 服务模型
Handler 数据处理接口
Processor 数据处理对象
Protocol 数据传输协议
Transport 数据传输方式
语法 : http://thrift.apache.org/docs/idl
1.支持的变量类型
类型 描述
bool #true, false
byte #8位的有符号整数
i16 #16位的有符号整数
i32 #32位的有符号整数
i64 #64位的有符号整数
double #64位的浮点数
string #UTF-8编码的字符串
binary #字符数组
struct #结构体
list<type> #有序的元素列表,类似于STL的vector
set<type> #无序的不重复元素集,类似于STL的set
map<type1,type2> #key-value型的映射,类似于STL的map
exception #是一个继承于本地语言的exception基类
service #服务包含多个函数接口(纯虚函数)
2 定义一个Thrift的IDL文件 HelloWorld.thrift
namespace php Services.HelloWorld
service HelloWorld
{
string sayHello(1:string name);
}
3 编译接口文件
thrift -gen php HelloWorld.thrift
怎么用:
1 编写thrift接口定义文件(IDL定义文件)
安装 thrift (http://thrift.apache.org/download)
git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift
cd thrift
#sudo ./configure && sudo make && sudo make install
./bootstrap.sh
./configure --prefix=/usr/local/thrift --with-ruby=no --with-erlang=no --with-java=no --with-csharp=no --enable-gen-java=no --enable-gen-csharp=no --enable-gen-rb=no --enable-gen-erl=no
make
make install
IDL 文件中定义类名字和类的方法 (实例 比如: api.thrift )
namespace php moponphp.thrift.api
service Api
{
string runAction(1:string r,2:map<string,string> params);
}
https://github.com/zekunyan/ThriftDemo_PHP_CPP Thrift interface definition
http://blog.csdn.net/heiyeshuwu/article/details/5982222 二、IDL描述
http://www.cnblogs.com/weiqubo/archive/2011/03/21/1989845.html IDL详解
编译 idl文件 生成文件夹
thrift -r --gen php:server api.thrift
会生成 ./gen-php/moponphp/thrift/api文件夹
Api.php 定义了 ApiIf,ApiClient
Types.php 定义了数据传入类型
2 编辑php 或其他语言的代码、
需要引入的文件:
1,库文件 http://thrift.apache.org/lib/php 安装包的 lib/php/目录下 默认安装位于 /usr/lib/php/Thrift/
2,接口定义文件 上例举例 Api.php,Types.php
客户端 构建 Types.php中的数据(如果有) 将这些数据 通过 client对象发送这些数据到服务器
服务器 编写handler文件 handler实现ldIf 接口 实现接口中定义的那些方, 封装编写启动或注册服务代码
注意: ldIf,handler,client,processor都是 编写的名字加这个字段形成的类名 比如: HelloWorldIf,HelloWorldClient,HelloWorHandler
其实用不着每个类都写成一个servers,只要定义一个其他的都从这一个接口过去然后做分流就可以了
3 部署
服务器代码实例:
1. 创建Handler (具体类和方法的实现代码,Handler类必须实现 ldIf类 比如: class HelloWorldHandler implements HelloWorldIf{} )
2. 基于Handler创建 Processor(数据处理对象,脚本自动生成的文件中包含这个类)
3. 创建Transport(通信方式 比如:TSocket:采用TCP Socket进行数据传输,THttpTransport:采用Http传输协议进行数据传输)
4. 创建Protocol方式(设定传输格式 比如:TBinaryProtocol – 二进制格式,TCompactProtocol – 压缩格式,TJSONProtocol – JSON格式)
5. 基于Processor, Transport和Protocol创建Server (详见lib/Server/*)
6. 运行Server
启动服务器:
客户端
1. 创建Transport
2. 创建Protocol方式
3. 基于Transport和Protocol创建Client
4. 运行Client的方法
摘自:
https://github.com/zekunyan/ThriftDemo_PHP_CPP/blob/master/PHP/client.php 官网原生实例
http://www.nonb.cn/blog/thrift-in-php.html Thrift在PHP中调用的方法
http://www.tuicool.com/articles/NV3Yni3 RPC框架Thrift例子-PHP调用C++后端程序
https://github.com/zekunyan/ThriftDemo_PHP_CPP git实例 php客户端 c++服务器
http://blog.csdn.net/heiyeshuwu/article/details/5982222 thrift 轻松实现多语言跨服务器通信 py服务器 php客户端
https://my.oschina.net/penngo/blog/496992 thrift php服务器端开发
https://github.com/walkor/workerman-thrift 扩展 workerman-thrift-rpc
http://www.yiiframework.com/extension/thriftclient/#hh2 yii1.0 thriftclient的封装
moponphp/thrift 使用方法 1 配置文件添加组件:
'thrift' => [
'class' => 'moponphp\thrift\Connection',
// 'transport'=>'TSocket', #类型
// 'hostname' => '127.0.0.1',
// 'port' => 9090,
'path' => '/act/wwwapi/web/index.php?r=thrift/runaction' #路径transport= TPhpStream 会用到这个参数
],
2 服务器端添加控制器并添加一个方法 写入以下代码 (这个控制器也就是配置文件中的path)
Yii::$app->thrift->regService("Api");
return Yii::$app->thrift->serviceParseOnes();
3 在相应的位置调用客户端中的方法 (注: api是服务名 runaction 是服务的方法名 )
Yii::$app->thrift->api->runaction();
备注: 还可以设置为TSocket 模式 服务器端 需要在命令行初始化服务 Yii::$app->thrift->initServices();