Swoft 2 框架概览

最近在工作中使用到了一款swoole的衍生框架 Swoft ,虽然会有一些小毛病,但整体上还是不错的,安利一下,说不定就用上了呢?

文章结尾里面有重点噢!

简介:

Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-FPM。有类似 Go 语言的协程操作方式,有类似 Spring Cloud 框架灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等。

环境要求:

  • php 7.1 +
  • composer
  • swoole 4.3.4 +

安装:

composer create-project swoft/swoft swoft

使用:

在官方默认的配置中,以及在composer中增加了许多的组件,包括http-server,rpc-server,rpc-client,redis,views,db,websocket等很多组件,可以根据项目进行配置。

常用服务:

启动http server

php bin/swoft http:start       //(start|restart|stop|reload)

启动rpc server

php bin/swoft rpc:start        //(start|restart|stop|reload)

启动websocket server

php bin/swoft ws:start         //(start|restart|stop|reload)

均支持 -d 参数以后台运行。

目录:

而且对于目录结构,也是以及为开发者定义好了功能目录,可以在开发中根据定义的功能目录直接存放代码文件,或者在其中定义业务相关的目录均可。配置上既有文档约定又具有一定的灵活性。

├── app/   ------ 应用代码目录
│   ├── Annotation/   ------- 定义注解相关
│   ├── Aspect/       ------- AOP 切面
│   ├── Bean/         ------- 一些具有独立功能的class bean
│   ├── Console/      ------ 命令行代码目录
│   │   ├── Command/
│   ├── Exception/      ------ 定义异常类目录
│   │   └── Handler/     ------ 定义异常处理类目录
│   ├── Http/         ------ HTTP 代码目录
│   │   ├── Controller/
│   │   └── Middleware/
│   ├── Helper/
│   │   └── Functions.php
│   ├── Listener/     ------ 事件监听器目录
│   ├── Model/        ------ 模型、逻辑等代码目录(这些层并不限定,根据需要使用)
│   │   ├── Dao/
│   │   ├── Data/
│   │   ├── Logic/
│   │   └── Entity/
│   ├── Validator/     ------ 自定义校验器目录
│   ├── Rpc/          ------ RPC 代码目录
│   │   └── Service/
│   │   └── Middleware/
│   ├── WebSocket/     ------ WebSocket 代码目录
│   │   ├── Chat/
│   │   ├── Middleware/
│   │   └── ChatModule.php
│   ├── Application.php -------- 应用类文件继承自swoft核心
│   ├── AutoLoader.php  -------- 项目扫描等信息(应用本身也算是一个组件)
│   └── bean.php      -- bean配置文件
├── bin/
│   ├── bootstrap.php
│   └── swoft   ------ swoft 入口文件
├── config/     ------ 应用配置目录
│   ├── base.php  --- 基础配置
│   ├── dev  --- dev环境配置
│   │   ├── base.php   -- dev环境基础配置  会覆盖外部配置
│   │   └── db.php    -- dev环境db配置
│   └── db.php
├── public/     ------ WEB可访问目录
├── resource/   ------ 应用相关资源目录
│   ├── language/   ------ 语言资源目录  
│   └── view/       ------ 视图资源目录  
├── runtime/    ------ 临时文件目录(日志、上传文件、文件缓存等)
├── test/       ------ 单元测试代码目录
│   └── bootstrap.php
├── composer.json
├── composer.lock
├── phar.build.inc
└── phpunit.xml.dist

注解:

注解的功能是我比较喜欢的,支持通过注解进行依赖注入,可以通过 @Bean() 默认创建全局单例,或者不同的参数@Bean(scope=Bean::PROTOTYPE) 定义原型(每次注入均克隆一份原型对象)等。

/**
 * 日期处理,这里定义了一个全局单例。
 * @Bean()
 */
class DateHandler {}

/**
 * 列表数据对象,这里定义了一个原型,因为列表数据不能共用,每个列表是不同的。
 * @Bean(scope=Bean::PROTOTYPE)
 */
class ListData {}

使用的时候则通过注解 @Inject() 进行注入到使用的类中,如果不设置注入参数则默认引入@var定义的类实例对象。

class ShowController {
    /**
     * @Inject()
     * @var \Namespace\DateHandler
     */
    private $dateHandle;
}

这些注解均利用反射实现,由于是常驻内存型的程序,所以在开启服务的过程中就完成了所有对象的实例化和注入,全部数据均加载到内存中,所以实际运行会非常快,运行中不再涉及反射等操作。

注解还包括http-server的控制器,异步或协程任务的执行方法,配置的注入等。

/**
 * @Config("list.style")
 */
private $listStyleConfig;

注解中值得注意的是,不能使用单引号,必须使用双引号。

Task:

任务处理器定义使用@Task(),任务入口方法使用@TaskMapping()。

/**
 * @Task(name="someTask")
 */
class SomeTask {
    /**
     * @TaskMapping()
     */
    public function run(string $name)
}

异步任务:

// Task::async(task_name, method, params);
Task::async('someTask', 'run', ['hello world']);

协程任务:

// Task::co(task_name, method, params);
Task::co('someTask', 'run', ['hello world']);

批量协程任务:

$tasks = [
    [
        'someTask',
        'run',
        ['hello world']
    ]
];

Task::cos(array $tasks);

控制器:

控制器使用@Controller来定义,控制器方法使用@RequestMapping定义。

/**
 * @Controller("/")
 */
class OrderController {
    /**
    * @RequestMapping(route="index")
    * @Validate("order")
    */
    public function index() {}
}

注意:

swoft 2.0.5+ 验证器默认没有启动,需要开发者自己开启。需要开启校验器的http中间件,使用官方配置全局的http中间件并未起作用,只有在控制器中使用中间件注解才能起作用。

/**
 *
 * @Middlewares({
 *    @Middleware(ValidatorMiddleware::class)
 * })
 * @Controller("/")
 *
 */
class SomeController {}

校验器中的属性校验配置注解 @NotEmpty() 不能单独使用,必须与变量类型判断注解一同使用,例如@IsString()、@IsArray()等。校验器中的属性校验配置注解 @Require() 不能使用。直接使用后均无法启动项目。

/**
 * 订单数据校验
 * @Validator(name="order")
 */
class OrderValidator
{
    /**
     * @IsInt("订单id类型不正确")
     * @NotEmpty("订单id不存在")
     */
    protected $id;
}

swoft自带redis开启配置时需要安装php的redis扩展。使用redis时可通过注入使用:

use Swoft\Redis\Pool;

/**
 * @Inject()
 * @var Pool
 */
private $redis;

本文分享自微信公众号 - 可回收BUG(way-of-full-stack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生活不止眼前的代码

基于Docker搭建Redis Cluster ,三主三从的配置

docker network create --subnet=192.168.200.0/24 redisclusternet

8720
来自专栏生活不止眼前的代码

SpringBoot 2.x 使用Redis作为缓存 设置有效时间及自动更新策略

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

1.6K30
来自专栏生活不止眼前的代码

基于DOCKER安装Redis Sentinel 集群以及springboot连接Redis哨兵集群demo

12820
来自专栏Java架构学习路线

3年Java开发都知道的Redis数据结构和通用命令

Redis支持多种不同的数据结构,包括5种基础数据结构和几种比较复杂的数据,这些数据结构可以满足不同的应用场景。

4200
来自专栏生活不止眼前的代码

SpringCloudGateway笔记(4)-WebSession

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

60330
来自专栏云Redis数据库

最高50万QPS! 腾讯云新发布Redis 4.0标准版突破性能极限

Redis在缓存应用场景中拥有不可取代的地位,被广泛应用于数据缓存、游戏存储、分布式会话存储、实时分析和机器学习等场景。腾讯云在Redis数据库领域的不断突破,...

8900
来自专栏蓝天

如何保证最少消费一次redis的list队列数据

简使用pop,不能保证最少消费一次,比如pop超时可能中途丢失,或者消费者处理过程中异常而未能处理完。

10720
来自专栏生活不止眼前的代码

分布式缓存--一致性hash原理和hash槽,以及算法实现

我们在使用n台存储设备存储数据的时候,常规做法有将数据根据key%n这样计算放在哪台服务器,但是在扩容的时候就会遇到数据迁移的问题,比如扩容m台服务器,以前是k...

8530
来自专栏生活不止眼前的代码

SpringCloudGateway笔记(9)-限流

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

12720
来自专栏生活不止眼前的代码

基于DOCKER安装Redis Sentinel 集群导致的NAT网络问题解决方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

8330

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励