从零开始基于go-thrift创建一个RPC服务 (3)

然后还需要修改/lib-php/Thrift/ClassLoader/ThriftClassLoader.php,将findFile()方法的$className . '.php';改为$class . '.php';,大概在197行。修改好的参考:https://github.com/52fhy/thrift-sample/blob/master/lib-php/Thrift/ClassLoader/ThriftClassLoader.php

然后现在可以运行了:

$ php client.php object(Sample\Response)#9 (3) { ["errCode"]=> int(0) ["errMsg"]=> string(7) "success" ["data"]=> array(1) { ["User"]=> string(80) "{"id":100,"name":"test","avatar":"avatar","address":"address","mobile":"mobile"}" } } object(Sample\Response)#10 (3) { ["errCode"]=> int(1) ["errMsg"]=> string(15) "user not exist." ["data"]=> array(0) { } } php服务端

thrift实现的服务端不能自己起server服务独立运行,还需要借助php-fpm运行。代码思路和golang差不多,先实现interface里实现的接口,然后使用thrift对外暴露服务:

server.php

<?php /** * Created by PhpStorm. * User: yujc@youshu.cc * Date: 2019-07-07 * Time: 08:18 */ error_reporting(E_ALL); $ROOT_DIR = realpath(dirname(__FILE__) . '/lib-php/'); $GEN_DIR = realpath(dirname(__FILE__)) . '/gen-php/'; require_once $ROOT_DIR . '/Thrift/ClassLoader/ThriftClassLoader.php'; use Thrift\ClassLoader\ThriftClassLoader; use Thrift\Protocol\TBinaryProtocol; use Thrift\Transport\TSocket; use Thrift\Transport\TBufferedTransport; use \Thrift\Transport\TPhpStream; $loader = new ThriftClassLoader(); $loader->registerNamespace('Thrift', $ROOT_DIR); $loader->registerDefinition('Sample', $GEN_DIR); $loader->register(); class Handler implements \Sample\GreeterIf { /** * @param \Sample\User $user * @return \Sample\Response */ public function SayHello(\Sample\User $user) { $response = new \Sample\Response(); $response->errCode = 0; $response->errMsg = "success"; $response->data = [ "user" => json_encode($user) ]; return $response; } /** * @param int $uid * @return \Sample\Response */ public function GetUser($uid) { $response = new \Sample\Response(); $response->errCode = 1; $response->errMsg = "fail"; return $response; } } header('Content-Type', 'application/x-thrift'); if (php_sapi_name() == 'cli') { echo "\r\n"; } $handler = new Handler(); $processor = new \Sample\GreeterProcessor($handler); $transport = new TBufferedTransport(new TPhpStream(TPhpStream::MODE_R | TPhpStream::MODE_W)); $protocol = new TBinaryProtocol($transport, true, true); $transport->open(); $processor->process($protocol, $protocol); $transport->close();

这里我们直接使用php -S 0.0.0.0:8080启动httpserver,就不使用php-fpm演示了:

$ php -S 0.0.0.0:8080 PHP 7.1.23 Development Server started at Sun Jul 7 10:52:06 2019 Listening on :8080 Document root is /work/git/thrift-sample Press Ctrl-C to quit.

我们使用php客户端,注意需要加参数,调用http协议连接:

$ php client.php --http object(Sample\Response)#9 (3) { ["errCode"]=> int(0) ["errMsg"]=> string(7) "success" ["data"]=> array(1) { ["user"]=> string(80) "{"id":100,"name":"test","avatar":"avatar","address":"address","mobile":"mobile"}" } } object(Sample\Response)#10 (3) { ["errCode"]=> int(1) ["errMsg"]=> string(4) "fail" ["data"]=> NULL } thrift IDL语法参考

1、类型定义

(1) 基本类型

bool:布尔值(true或false) byte:8位有符号整数 i16:16位有符号整数 i32:32位有符号整数 i64:64位有符号整数 double:64位浮点数 string:使用UTF-8编码编码的文本字符串

注意没有无符号整数类型。这是因为许多编程语言中没有无符号整数类型(比如java)。

(2) 容器类型

list<t1>:一系列t1类型的元素组成的有序列表,元素可以重复 set<t1>:一些t1类型的元素组成的无序集合,元素唯一不重复 map<t1,t2>:key/value对,key唯一

容器中的元素类型可以是除service以外的任何合法的thrift类型,包括结构体和异常类型。

(3) Typedef

Thrift支持C/C++风格的类型定义:

typedef i32 MyInteger

(4) Enum
定义枚举类型:

enum TweetType { TWEET, RETWEET = 2, DM = 0xa, REPLY }

注意:编译器默认从0开始赋值,枚举值可以赋予某个常量,允许常量是十六进制整数。末尾没有逗号。

不同于protocol buffer,thrift不支持枚举类嵌套,枚举常量必须是32位正整数。

示例里,对于PHP来说,会生成TweetType类;对于golang来说,会生成TweetType_开头的常量。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzdxy.html