| 2014年2月13日
- 一方面是测试使用,另一方面还想把server的一些状态和运维信息能够以web的方式展示出来,组内的web框架全是ci,我想使用django,但是组内python的人少,所以还是随大家要使用ci,用php做开发,那么就需要php也能支持使用thrift的rpc方式去访问。
- php也和python一样需要依赖thrift已经写好的一些库,但是php的库一般我们是直接拷贝到和程序一起就可以使用,相对python多了些灵活,而且不需要为平台编译,担任python也可以直接使用库,但是python的库需要编译才可以生成,不通的系统应该需要重新编译。 我的开发目录如下:
gen-php php_client.php meta_node.thrift thrift_php_lib
php_client.php 是我编写的程序文件用来访问服务,
meta_node.thrift 是我写的thrift的idl文件
thrift_php_lib 是直接拷贝thrift-0.9.0/lib/php/lib 这个目录到但前目录,这个库直接拷贝到这里就可以直接使用,在正式开发时可以放到ci的自定义库路劲中即可,当然也可以放到任意地方,这点教为灵活。
- 编译thrift脚本文件为php脚本
thrift --gen php meta_node.thrift
ls gen-php/idata/factory/meta_node/
MetaNodeService.php Types.php
这里生成两个文件,类文件和数据定义文件,按照namespace的结构来建立目录,
head meta_node.thrift
namespace cpp idata.factory.meta_node
namespace php idata.factory.meta_node
- 编写测试程序
<?php
$GLOBALS['THRIFT_ROOT'] = 'thrift_php_lib/'; # 指定库目录,可以是绝对路径或是相对路径
require_once $GLOBALS['THRIFT_ROOT'].'Thrift/ClassLoader/ThriftClassLoader.php';
use Thrift\ClassLoader\ThriftClassLoader;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TSocket;
use Thrift\Transport\TSocketPool;
use Thrift\Transport\TFramedTransport;
use Thrift\Transport\TBufferedTransport;
$GEN_DIR = realpath(dirname(__FILE__)).'/gen-php';
$loader = new ThriftClassLoader();
$loader->registerNamespace('Thrift', $GLOBALS['THRIFT_ROOT']); # 加载thrift
$loader->registerDefinition('idata\factory\meta_node', $GEN_DIR); # 加载自己写的thrift文件编译的类文件和数据定义
$loader->register();
$socket = new TSocket('127.0.0.1', 9300); # 建立socket
$socket->setDebug(TRUE);
$framedSocket = new TFramedTransport($socket); #这个要和服务器使用的一致
$transport = $framedSocket;
$protocol = new TBinaryProtocol($transport); # 这里也要和服务器使用的协议一致
$transport->open();
$client= new \idata\factory\meta_node\MetaNodeServiceClient($protocol); # 构造客户端
$result = $client->get_active_meta_node(); # 对服务器发起rpc调用
echo $result."\r\n"; # 打印调用结果
$transport->close(); # 关闭链接
?>
- 运行
在命令行下直接执行下面的命令即可:
#php php_client.php
127.0.0.1
- 总结
在使用上php的客户端写法和python,c++都差不多,主要都是要引入thrift已经提供的类库,然后就是一般的socket调用和函数调用,但是感觉php的库可以随意部署,在使用上感觉爽一点,这样程序部署会相对python方便一点。
关注「黑光技术」,关注大数据+微服务