PHPackages                             lmz/thefair-skeleton - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. lmz/thefair-skeleton

ActiveProject[Framework](/categories/framework)

lmz/thefair-skeleton
====================

A coroutine framework that focuses on hyperspeed and flexible, specifically use for build microservices and middlewares.

v2.2.1(4y ago)1321Apache-2.0PHPPHP &gt;=7.4

Since Jun 20Pushed 4y agoCompare

[ Source](https://github.com/liumingzhij26/hyperf-skeleton)[ Packagist](https://packagist.org/packages/lmz/thefair-skeleton)[ RSS](/packages/lmz-thefair-skeleton/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (8)Versions (25)Used By (0)

Rpc Service 搭建说明文档
==================

[](#rpc-service-搭建说明文档)

\[TOC\]

安装
--

[](#安装)

仅可运行于 Linux 和 Mac 环境下，Windows 下也可以通过 Docker for Windows 来作为运行环境或虚拟机，通常来说 Mac 环境下，推荐本地环境部署

- PHP &gt;= 7.2
- Swoole PHP 扩展 &gt;= 4.4，并关闭了 Short Name
- OpenSSL PHP 扩展
- JSON PHP 扩展
- PDO PHP 扩展 （如需要使用到 MySQL 客户端）
- Redis PHP 扩展 （如需要使用到 Redis 客户端）
- Protobuf PHP 扩展 （如需要使用到 gRPC 服务端或客户端）

`composer create-project lmz/thefair-skeleton test_service`

本地配置文件 `.env`

安装包 `composer up`

启动服务开发 `php dev_start.php -c`

项目文件结构
------

[](#项目文件结构)

```
├── app
│   ├── Constants   // 常量约定
│   ├── Contract    // 接口
│   ├── Controller  // 控制器
│   ├── Event       // 事件
│   ├── Exception   // 异常处理
│   │   └── Handler // Error 监听器
│   ├── Job         // 异步任务处理
│   ├── Library     // 系统自定义库
│   ├── Middleware  // 中间件
│   ├── Model       // 数据模型，只处理数据库、缓存相关
│   ├── Process     // 多进程管理
│   ├── Request     // 参数约定
│   ├── Server      // 系统核心服务
│   └── Service     // 业务处理
├── listener    // 事件监听器
├── bin
│   └── hyperf.php  // 架构启动文件
├── composer.json
├── composer.lock
├── config          // 配置文件
├── docs            // 文档
│   └── sql
├── openapi.yaml    // 自动生成文档
├── phpunit.xml     // 单元测试
├── runtime         // 日志目录
│   ├── container
│   ├── hyperf.pid
│   └── logs
├── test            // 测试
│   ├── Cases
│   ├── HttpTestCase.php
│   └── bootstrap.php
├── Jenkinsfile     // 自动化测试
├── README.md       // 说明文档
├── .env            // 开发配置
├── .env.example    // demo 开发配置文件
├── .editorconfig   // 编辑器参数约定
├── README.md       // 说明文档
└── watch.php       // 本地开发热更新文件

```

### 配置文件结构

[](#配置文件结构)

```
config
├── autoload // 此文件夹内的配置文件会被配置组件自己加载，并以文件夹内的文件名作为第一个键值
│   ├── amqp.php  // 用于管理 AMQP 组件
│   ├── annotations.php // 用于管理注解
│   ├── aspects.php // 用于管理 AOP 切面
│   ├── auth // 系统白单名
│   ├── async_queue.php // 用于管理基于 Redis 实现的简易队列服务
│   ├── cache.php // 用于管理缓存组件
│   ├── commands.php // 用于管理自定义命令
│   ├── consul.php // 用于管理 Consul 客户端
│   ├── databases.php // 用于管理数据库客户端
│   ├── devtool.php // 用于管理开发者工具
│   ├── exceptions.php // 用于管理异常处理器
│   ├── listeners.php // 用于管理事件监听者
│   ├── lock.php // 分布式锁
│   ├── logger.php // 用于管理日志
│   ├── middlewares.php // 用于管理中间件
│   ├── opentracing.php // 用于管理调用链追踪
│   ├── processes.php // 用于管理自定义进程
│   ├── redis.php // 服务限流
│   ├── rate_limit.php // 用于管理 Redis 客户端
│   ├── translation.php // 国际化配置
│   ├── validation.php // 参数自动验证
│   ├── rate_limit.php // 用于管理 Redis 客户端
│   └── server.php // 用于管理 Server 服务
├── config.php // 用于管理用户或框架的配置，如配置相对独立亦可放于 autoload 文件夹内
├── container.php // 负责容器的初始化，作为一个配置文件运行并最终返回一个 Psr\Container\ContainerInterface 对象
├── dependencies.php // 用于管理 DI 的依赖关系和类对应关系
│   ├── i18n    // 国际化具体信息
│   │   └── languages
└── routes.php // 用于管理路由

```

开发必读
----

[](#开发必读)

### 不能通过全局变量获取属性参数

[](#不能通过全局变量获取属性参数)

在 `PHP-FPM` 下可以通过全局变量获取到请求的参数，服务器的参数等，在 `Hyperf` 和 `Swoole` 内，都 无法 通过 `$_GET/$_POST/$_REQUEST/$_SESSION/$_COOKIE/$_SERVER`等`$_`开头的变量获取到任何属性参数。

### 通过容器获取的类都是单例

[](#通过容器获取的类都是单例)

通过依赖注入容器获取的都是进程内持久化的，是多个协程共享的，所以不能包含任何的请求唯一的数据或协程唯一的数据，这类型的数据都通过协程上下文去处理，具体请仔细阅读 [依赖注入](https://hyperf.wiki/#/./zh/di) 和 [协程](https://hyperf.wiki/#/./zh/coroutine) 章节。

### 框架生命周期

[](#框架生命周期)

`Hyperf` 是运行于 `Swoole` 之上的，想要理解透彻 `Hyperf` 的生命周期，那么理解 `Swoole` 的生命周期也至关重要。 `Hyperf` 的命令管理默认由 `symfony/console` 提供支持(如果您希望更换该组件您也可以通过改变 `skeleton` 的入口文件更换成您希望使用的组件)，在执行 `php bin/hyperf.php start` 后，将由 `Hyperf\Server\Command\StartServer` 命令类接管，并根据配置文件 `config/autoload/server.php` 内定义的 `Server` 逐个启动。 关于依赖注入容器的初始化工作，我们并没有由组件来实现，因为一旦交由组件来实现，这个耦合就会非常的明显，所以在默认的情况下，是由入口文件来加载 `config/container.php` 来实现的。

### 禁止注入 model，实现单例方法

[](#禁止注入-model实现单例方法)

可以使用 `UserInfoModel::xxxx` 方法，或`make`，`new`

### 请求与协程生命周期

[](#请求与协程生命周期)

`Swoole` 在处理每个连接时，会默认创建一个协程去处理，主要体现在 `onRequest、onReceive、onConnect` 事件，所以可以理解为每个请求都是一个协程，由于创建协程也是个常规操作，所以一个请求协程里面可能会包含很多个协程，同一个进程内协程之间是内存共享的，但调度顺序是非顺序的，且协程间本质上是相互独立的没有父子关系，所以对每个协程的状态处理都需要通过 [协程上下文](https://hyperf.wiki/#/zh-cn/coroutine?id=%e5%8d%8f%e7%a8%8b%e4%b8%8a%e4%b8%8b%e6%96%87) 来管理。

路由
--

[](#路由)

路由必须是三级，/m/c/a

http 服务使用 `@AutoController`Rpc 服务使用 `@RpcService`

如 ` * @RpcService(name="v2/test", protocol="jsonrpc-tcp-length-check", server="json-rpc")`

### 参数过滤

[](#参数过滤)

路由 `/v2/test/get_test` 对应 `\App\Controller\V2\Test::getTest` 方法

必须新建一个对应的 `app/Request/V2/Test/GetTest.php` 文件

生成命令：`php bin/hyperf.php gen:request V2/Test/GetTest`

```
public function getTest()
{
    $uid = input('uid');
    $name = input('name');
    $fields = input('fields', []);
    return $this->showResult([
        $uid,
        $fields,
        $name,
    ]);
}
```

`input` 可以获得`GET|POST`参数，相当于`$_REQUEST`

***app/Request/V2/Test/GetTest.php*** 源码

```
