初识Swoft
参考素材
swoft官网:http://swoft.org/
在线官方文://档:http://www.swoft.org/documents/v2/
http://swoft.org/documents
参考文档:
最新版本
目前最新版本2.0.x
辅助工具
Swoft运行模式
参见:谈网络通信处理的原理的演进及编程实现详解 https://blog.youkuaiyun.com/yan_dk/article/details/89520632
传统PHP-Fpm
模式
传统 Nginx
+ PHP-Fpm
模式的配合已经运行得足够好,但是由于php-fpm
本身是同步阻塞进程模型,在请求结束后释放所有的资源(包括框架初始化创建的一系列对象,导致PHP进程空转(创建<-->销毁<-->创建)消耗大量的CPU
资源,从而导致单机的吞吐能力有限。请求夯住,会导致 CPU
不能释放资源, 大大浪费了 CPU
使用率。
基于Swoole扩展--Swoft
Swoft是首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield, 有类似 Go 语言的协程、灵活的注解、强大的全局依赖注入容器、灵活强大的 AOP、标准的 PSR 规范实现等等,可以用于构建高性能的Web系统、API、中间件、基础服务等等。
安装Swoft
使用Composer安装
安装composer,参见:https://blog.youkuaiyun.com/yan_dk/article/details/90228559
composer create-project swoft/swoft swoft2
注意:php环境配置>7.1,安装redis、swoole扩展。
然后在安装目录再执行composer安装组件
# cd swoft2
# composer update
成功后,看到项目swoft2下已经生成vendor目录,里面有各种支持的组件模块。
启动运行Swoft
-- 启动 HTTP 服务
php ./bin/swoft http:start
-- 以守护进程模式启动*
php ./bin/swoft http:start -d
-- 停止 HTTP 服务*
php ./bin/swoft http:stop
-- 重启 HTTP 服务*
php ./bin/swoft http:restart


注:swoft目前在windows环境暂不能运行,部署同步到linux服务器4上,本地只是通过IDE环境编辑上传服务器运行。推荐使用Phpstorm编辑器,可以设定自动上传,本地开发的代码与服务器端代码同步,如下图
示例
示例1(修改路由)
我们修改一下首页控制器,app/HomeController.php
...
class HomeController{
...
/**
* @RequestMapping("/test")
*
* @return Response
*/
public function test(): Response {
return context()->getResponse()->withContent('I am test');
}
...
}
我们增加了一个注解路由“/test”
浏览器再访问http://ip:18306/test
Swoft生命周期
通过了解swoft生命周期,运行模式能够更好的有利于利用swoft框架的开发,参考
官方文档,并且带着大家简单阅读下源码了解下运行机制。
- 首先会调用相关处理器做相关的初始化工作
ENV环境文件初始化
注解信息扫描收集
配置初始化
注册类到bean容器当中
收集事件监听器
启动console控制台启动相应的服务
class SwoftApplication implements SwoftInterface, ApplicationInterface{
...
protected function processors(): array
{
return [
new EnvProcessor($this),
new ConfigProcessor($this),
new AnnotationProcessor($this),
new BeanProcessor($this),
new EventProcessor($this),
new ConsoleProcessor($this),
];
}
...
}
2、注解信息扫描收集
在swoft当中大量使用了注解,从路由的配置到中间件配置等都依赖注解机制,所以注解需要在服务启动之前扫描到配置了注解的类,收集注解信息。
class AnnotationProcessor extends Processor{
...
// Find AutoLoader classes. Parse and collect annotations.
AnnotationRegister::load([
'inPhar' => \IN_PHAR,
'basePath' => $app->getBasePath(),
'notifyHandler' => [$this, 'notifyHandler'],
'disabledAutoLoaders' => $app->getDisabledAutoLoaders(),
'disabledPsr4Prefixes' => $app->getDisabledPsr4Prefixes(),
]);
...
}
持续完善,待续...