• tars2php说明文档
    • 简介
    • 使用说明

    tars2php说明文档

    简介

    tars2php主要功能是通过tars协议文件,自动生成client端和server端php代码,方便大家使用。(server端主要为框架代码,实际业务逻辑需要自己补充实现)

    使用说明

    如果用户只有使用打包解包需求的,那么使用流程如下:

    1. 准备一份tars协议文件,例如example.tars
    2. 编写一个tars.proto.php文件,这是用来生成代码的配置文件。
      1. //本范例的servant name为PHPTest.PHPServer.obj
      2. return array(
      3. 'appName' => 'PHPTest', //tars服务servant name 的第一部分
      4. 'serverName' => 'PHPServer', //tars服务servant name 的第二部分
      5. 'objName' => 'obj', //tars服务servant name 的第三部分
      6. 'withServant' => true,//决定是服务端,还是客户端的自动生成
      7. 'tarsFiles' => array(
      8. './example.tars' //tars文件的地址
      9. ),
      10. 'dstPath' => './server/', //生成php文件的位置
      11. 'namespacePrefix' => 'Server\servant', //生成php文件的命名空间前缀 );
    3. 执行php ./tars2php.php ./tars.proto.php
    4. 工具会根据servant name自动生成三级目录结构,demo中会在./server目录下生成PHPTest/PHPServer/obj/目录,obj目录下的classers是struct对应的php对象,tars目录是tars协议文件本身。如example.tars中的struct:

      1. struct SimpleStruct {
      2. 0 require long id=0;
      3. 1 require unsigned int count=0;
      4. 2 require short page=0;
      5. };

      转变成classes/SimpleStruct.php

      1. <?php
      2. namespace Server\servant\PHPTest\PHPServer\obj\classes;
      3. class SimpleStruct extends \TARS_Struct {
      4. const ID = 0; //tars协议中的tag
      5. const COUNT = 1;
      6. const PAGE = 2;
      7. public $id; //元素的实际值
      8. public $count;
      9. public $page;
      10. protected static $_fields = array(
      11. self::ID => array(
      12. 'name'=>'id', //tars协议中没个元素的name
      13. 'required'=>true, //tars协议中是require或者optional
      14. 'type'=>\TARS::INT64, //类型
      15. ),
      16. self::COUNT => array(
      17. 'name'=>'count',
      18. 'required'=>true,
      19. 'type'=>\TARS::UINT32,
      20. ),
      21. self::PAGE => array(
      22. 'name'=>'page',
      23. 'required'=>true,
      24. 'type'=>\TARS::SHORT,
      25. ),
      26. );
      27. public function __construct() {
      28. parent::__construct('PHPTest_PHPServer_obj_SimpleStruct', self::$_fields);
      29. }
      30. }
    5. 以example.tars中的interface部分会自动生成单独的已interface命名的php文件。 例如int testLofofTags(LotofTags tags, out LotofTags outtags);接口生成的方法如下

      • server部分
        1. <?php
        2. //注意生成文件中的注释部分会在server启动的时候转换为php代码,如非必要,请勿修改.
        3. //server部分具体实现需要自己继承完成,注释说明依次如下
        4. //参数为struct类型,对应$tags变量,对应的php对象在\Server\servant\PHPTest\PHPServer\obj\classes\LotofTags
        5. //参数为struct类型,对应$outtags变量,对应的php对象在\Server\servant\PHPTest\PHPServer\obj\classes\LotofTags,是输出参数
        6. //接口防止为int
        7. /**
        8. * @param struct $tags \Server\servant\PHPTest\PHPServer\obj\classes\LotofTags
        9. * @param struct $outtags \Server\servant\PHPTest\PHPServer\obj\classes\LotofTags =out=
        10. * @return int
        11. */
        12. public function testLofofTags(LotofTags $tags,LotofTags &$outtags);
      • client部分

        1. <?php
        2. try {
        3. $requestPacket = new RequestPacket(); //构建请求包需要的参数
        4. $requestPacket->_iVersion = $this->_iVersion;
        5. $requestPacket->_funcName = __FUNCTION__;
        6. $requestPacket->_servantName = $this->_servantName;
        7. $encodeBufs = [];
        8. $__buffer = TUPAPIWrapper::putStruct("tags",1,$tags,$this->_iVersion); //打包第一个参数tags
        9. $encodeBufs['tags'] = $__buffer;
        10. $requestPacket->_encodeBufs = $encodeBufs; //在请求包中设置请求bufs
        11. $sBuffer = $this->_communicator->invoke($requestPacket,$this->_iTimeout); //发送请求包,接收返回包
        12. $ret = TUPAPIWrapper::getStruct("outtags",2,$outtags,$sBuffer,$this->_iVersion); //从返回包中解出第一个输出参数outtags
        13. return TUPAPIWrapper::getInt32("",0,$sBuffer,$this->_iVersion); //解出返回参数 返回参数 name是空,tag为0
        14. }
        15. catch (\Exception $e) {
        16. throw $e;
        17. }