Swoft 2 框架概览

  • 2019 年 10 月 4 日
  • 筆記

最近在工作中使用到了一款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 NamespaceDateHandler       */      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 SwoftRedisPool;    /**   * @Inject()   * @var Pool   */  private $redis;