thrift之php客户端使用

| 2014年2月13日

  1. 一方面是测试使用,另一方面还想把server的一些状态和运维信息能够以web的方式展示出来,组内的web框架全是ci,我想使用django,但是组内python的人少,所以还是随大家要使用ci,用php做开发,那么就需要php也能支持使用thrift的rpc方式去访问。
  1. 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的自定义库路劲中即可,当然也可以放到任意地方,这点教为灵活。

  1. 编译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
  1. 编写测试程序
<?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();                       # 关闭链接
?>
  1. 运行

在命令行下直接执行下面的命令即可:

#php php_client.php
127.0.0.1
  1. 总结

在使用上php的客户端写法和python,c++都差不多,主要都是要引入thrift已经提供的类库,然后就是一般的socket调用和函数调用,但是感觉php的库可以随意部署,在使用上感觉爽一点,这样程序部署会相对python方便一点。

看完本文有收获?请分享给更多人

关注「黑光技术」,关注大数据+微服务