数据库 - Model 前置说明
官方开源项目 抓取代理IP

介绍

RPC服务的相关服务控制器代码,统一存放在/app/rpc/目录下。

服务控制器可以不继承任何框架基类。

但从v2.5.1版本起,框架提供了专属RPC控制器的系统基类,继承\x\controller\Rpc基类,可以更清晰的书写控制器代码。

RPC客户端的请求方式,类似于调用类的某个方法,例如下面的客户端调用代码:

<?php
$Rpc = new \x\RpcClient();
$body = $Rpc->route('order/create')
        ->func('run')
        ->param(['id' => 1, 'name' => 'sw-x'])
        ->send();

就是请求的\app\rpc\order\createRPC服务类,里面的run()操作方法。

注意事项

1、创建RPC服务控制器时,每个允许被客户端访问的RPC操作方法,都必须是public类型,同时不能声明static静态属性。


2、不能定义名为$headers$param$msg$rpc_msg$rpc_error这5个成员属性变量,因为该变量已被框架赋值占用。


3、RPC操作方法中return的值,即为RPC客户端所获得的返回内容。
可以理解为:服务端返回,既客户端所得。

使用案例一

不继承系统基类,创建order/create -> run服务代码:
文件地址:\app\rpc\order\create.php

namespace app\rpc\order;

class create {

    /**
     * 我是order/create->run()服务
    */
    public function run() {
        // 可以这样获取请求头
        $headers = $this->headers;
        // 可以这样获取请求参数
        $param = $this->param;
        // 可以这样设置返回值说明
        $this->msg = '缺少某些请求参数啦!';
        // 直接抛出返回值
        return false;
    }
}

使用案例二

继承系统基类,创建order/create -> run服务代码:
文件地址:\app\rpc\order\create.php
当继承该基类时,控制器风格更偏向面向对象方式。

namespace app\rpc\order;

// 新版本都应该继承系统基类
use x\controller\Rpc;

class create extends Rpc{

    /**
     * 我是\order\create->run()服务
    */
    public function run() {
        // 可以这样获取请求头
        $headers = $this->headers();
        // 可以这样获取请求参数
        $param = $this->param();
        // 可以这样设置返回值说明
        $this->msg('缺少某些请求参数啦!');
        // 可以这样抛出返回值,并同时设置返回值说明
        return $this->fetch(false, '缺少某些请求参数啦!');

        // 当然,也支持这样获取请求头
        $headers = $this->headers;
        // 当然,也支持这样获取请求参数
        $param = $this->param;
        // 当然,也支持直接设置返回值说明
        $this->msg = '缺少某些请求参数啦!';
        // 当然,也支持直接抛出返回值
        return false;
    }
}

注意:服务创建完成后,此时客户端还不能调用,开发者还需要到Web服务中心注册相关服务,具体参考部署服务中心章节。

获取请求参数

依赖类:\x\controller\Rpc
方法名:param()
版本:v2.5.1版本起支持

参数:无

返回值:array

示例代码:

namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;

class create extends Rpc{
    /**
     * 我是\order\create->run()服务
    */
    public function run() {
        // 可以这样获取请求参数
        $param = $this->param();
        // 当然,也支持这样获取请求参数
        $param = $this->param;
    }
}

获取请求头

依赖类:\x\controller\Rpc
方法名:headers()
版本:v2.5.1版本起支持

参数:无

返回值:array

示例代码:

namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;

class create extends Rpc{
    /**
     * 我是\order\create->run()服务
    */
    public function run() {
        // 可以这样获取请求头
        $headers = $this->headers();
        // 当然,也支持这样获取请求头
        $headers = $this->headers;
    }
}

返回结果集

依赖类:\x\controller\Rpc
方法名:fetch()
版本:v2.5.1版本起支持

参数:

  • mixed $return

    • 功能:返回给RPC客户端的结果集
    • 值单位:不限制
    • 默认值:无
    • 其它值:无
  • string $msg

    • 功能:返回值说明
    • 值单位:不限制
    • 默认值SUCCESS,非必填
    • 其它值:无

返回值:$return的内容

示例代码:

namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;

class create extends Rpc{
    /**
     * 我是\order\create->run()服务
    */
    public function run() {
        // 可以这样抛出返回值,并同时设置返回值说明
        return $this->fetch(false, '缺少某些请求参数啦!');
        // 也可以只抛出返回值
        return $this->fetch(false);

        // 更简洁的,你还可以直接return
        return false;
    }
}

单独设置Msg

场景:虽然fetch()方法可以在输出结果集的同时,设置msg内容,但有些时候业务往往是最后才抛出结果集,但中途却要各种判断,提前设置好各种场景下的msg说明。
依赖类:\x\controller\Rpc
方法名:msg()
版本:v2.5.1版本起支持

参数:

  • string $msg

    • 功能:返回值说明
    • 值单位:不限制
    • 默认值:无
    • 其它值:无

返回值:无

示例代码:

namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;

class create extends Rpc{
    /**
     * 我是\order\create->run()服务
    */
    public function run() {
        // 可以这样设置
        $this->msg('缺少某些请求参数啦!');
        // 也可以这样设置
        $this->msg = '缺少某些请求参数啦!'
        // 可以这样抛出返回值,并同时设置返回值说明
        return $this->fetch(false, '缺少某些请求参数啦!');
    }
}

标记当前请求处理异常

场景:往往在日常开发中,开发者会遇到在某种情况下逻辑处理不通过,例如第三方API调用失败等场景,按照习惯,这种请求需要记录到日志当中,便于排查。
而在这种场景下,标记请求处理异常,框架则会自动把当次请求的相关信息,记录到Web服务中心当中。

数据存储在Redis,单个服务节点异常最大记录上限,默认是20条,超出则会把最早一条记录删除。
若要修改上限,可以在/config/rpc.php文件中进行修改,参数名称是rpc_error_max


依赖类:\x\controller\Rpc
方法名:error()
版本:v2.5.1版本起支持

参数:

  • string $msg

    • 功能:记录到服务中心的错误说明
    • 值单位:不限制
    • 默认值:无
    • 其它值:无

返回值:无

示例代码:

namespace app\rpc\order;
// 需要继承基类
use x\controller\Rpc;

class create extends Rpc{
    /**
     * 我是\order\create->run()服务
    */
    public function run() {
        // 假设这个是第三方API服务
        $res = new API();
        if (!$res) {
            // 记录该次请求为异常请求 并设置自定义错误内容
            $this->error($res['msg']);
        }
        // 如果是发短信这种不应该核心业务的功能,代码还是得往下走的
        
        // 最终不影响客户端的结果
        return $this->fetch(true);
    }
}

SW-X

企业级 - 高性能 PHP 框架

最后更新:3年前 . 作者-小黄牛

本篇目录