最近在工作中使用到了一款swoole的衍生框架 Swoft ,虽然会有一些小毛病,但整体上还是不错的,安利一下,说不定就用上了呢?
文章结尾里面有重点噢!
简介:
Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP-FPM。有类似 Go 语言的协程操作方式,有类似 Spring Cloud 框架灵活的注解、强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等。
环境要求:
安装:
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;
完