Download the PHP package watish/watishweb without Composer
On this page you can find all versions of the php package watish/watishweb. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package watishweb
Watish WEB
一个swoole驱动的多进程全协程的轻量Web框架
技术栈
Swoole,PHP
框架特点
- 支持websocket
- 通过UnixSocket异步实现多进程间的全局变量一致
- 支持独立进程Process
- 可动态添加,修改,删除的Crontab定时任务
- 基于协程且生产可用的优雅异步回调Promise
- 支持Task异步投递闭包任务
- 支持路由注解,中间件注解,全局中间件注解,CLI命令注解
- 支持AOP面向切片开发
- 基于Swoole\Table的分块存储KV内存表
环境要求
- PHP 8+
- Swoole v5.0+
快速开始
使用Git
使用Composer
启动项目
项目的入口文件为 项目/bin/CoServer.php
使用swoole-cli (推荐)
使用php(需安装swoole拓展)
目录结构
- bin/ 入口文件
- config/ 配置文件目录
- src/ 业务逻辑目录
- opt/ 项目工具类目录
- storage/ 存储目录
- Framework/ 用于存放项目生成文件,如代理类缓存
- View/ 用于存放视图文件(挖坑)
- vendor/ 组件目录
- tools/
- php-cs-fixer/
- vendor-bin/
- box/
编写一个Hello World
在 src/Controller目录下新建一个类,这里我们定义为HelloController
保存后,启动项目,访问 http://127.0.0.1:9502/ 便能看到
是不是很简单 😜
注解 Attribute
- Inject 依赖注入,属性注解 Inject(string $class)
- Middleware 局部中间件,方法注解,类注解 Middleware(array $middlewares)
- GlobalMidlleware 全局中间件,类注解 GlobalMidlleware 无参数
- Asyc 异步执行,方法注解 Async 无参数
- Aspect 切片,方法注解 Aspect(string $class)
- Command 命令,类注解 Command(string $command , string $prefix)
- Crontab 定时任务,类注解 Crontab(string $rule)
- Process 独立进程,类注解 Process(string $name , int $worker_num =1)
上下文管理 Context
不同于传统的php-fpm形式,多进程之间存在内存隔离,这意味着在进程A设定的变量进程B是无法获取的,此外,请求与请求之间并不是隔离的,也就是说,在同一进程下的两个请求,尽管在不同的协程中处理逻辑,如果都对全局变量A修改,那么全局变量会被修改两次
具体可查阅swoole文档中的 编程须知#严重错误
使用 Watish\Components\Includes\Context 可以有效规避上述问题
Context是一个静态类,不仅提供了简单的Get,Set方法,还通过进程通信提供了多worker进程全局变量的GlobalSet,GlobalGet等方法
注:多worker进程全局变量设定(Context::Global_Set等方法)是基于UnixSocket异步实现的,不能保证某一时刻的数据一致,这里可以使用 Watish\Components\Utils\Table ,一个对 Swoole\Table 的封装KV内存表,可以充分利用每一行资源,并支持闭包序列化
请求 Request
当浏览器发送请求至服务器,服务器会调用handle方法,随后通过路由调度器判断请求路由是否存在,存在解析路由参数,封装至 Watish\Components\Struct\Request,传入 全局中间件 -> 局部中间件 -> 控制器
路由 Route
注册路由的两种方式
通过Prefix,Path注解注册
注:需要在 /config/server.php 中修改 register_route_auto 为 true
Prefix是类注解,定义该类下路由的前缀
Path是方法注解,定义路由路径
举个栗子:
上述代码的路由如下
路径 | 控制器 | 方法 | 中间件 |
---|---|---|---|
/hello/index | HelloController@index | ANY | 无 |
/hello/user/{name} | HelloController@msg | GET,POST | TestMiddleware |
通过配置文件注册路由
路由配置文件路径为:项目/config/route.php
复用上面的栗子,则上述路由配置应如下
register方法传参如下
中间件 Middleware
注:中间件都要implement MiddlewareInterface接口
全局中间件
通过注解注册
可以通过使用 GlobalMiddleware 的 类注解 实现全局中间件的注册
举个例子:
通过路由注册
配置文件路径为:项目/config/route.php
局部中间件
通过注解注册
可以使用 Middleware 来对控制器或者某个方法进行注解
先创建一个 TestMiddleware
然后修改 HelloController
如上,index方法和msg方法都有了局部中间件 TestMiddleware
当然,上述代码还能一下这样写,直接给HelloController添加 Middleware 注解
通过配置文件注册
参考路由章节中的配置文件路由注册方法 register 传参 ,此处不做赘述
控制器 Controller
控制器是整个业务项目的核心,负责处理请求,调用服务,返回数据
比较简单,不多描述
配合依赖注入,举个栗子:
注:暂不支持构造方法注入,后续会完善(挖坑)
服务 Service
直接贴代码
在Service中,仍然可以进行依赖注入,此外,还可以对方法进行Async注解(注意,被Async注解的方法必须是void类型)使其成为一个异步方法
命令 Command
Command类文件存放于 项目/src/Command/
注:Command类需要implement CommandInterface 接口
命令类只能使用注解注册命令
示例代码如下:
上述代码,可以通过以下方式执行
swoole-cli
PHP
注解Command的用法
Task 定时任务
Task类存放于 项目/src/Task/
注:所有的Task类都要implement TaskInterface
Task类只支持使用Crontab注解注册定时任务
示例代码如下:
这是一个每秒都会输出Hello的定时任务
Crontab注解使用方法
其中,rule为标准的crontab表达式
数据库 Database
注:暂只有mysql,redis(可自己加)
本框架使用了连接池来维护mysql,redis连接,并于启动初完成了连接池的创建,现只需在业务逻辑中使用即可
Watish\Components\Includes\Database::mysql() 返回一个对Laravel查询构造器的封装(主要是改变了底层Pdo逻辑,正常使用无差异)
Watish\Components\Includes\Database::redis() 返回一个Predis的Client
请先配置数据库! 配置文件:项目/config/database.php
其它工具
框架使用了以下组件,并对某些组件进行了封装
在 Watish\Components\Constructor 命名空间下,提供了对一些组件的快速构造
异步任务
AsyncTaskConstructor::make() 异步任务投递
文件系统
LocalFilesystemConstructor::getFilesystem() 本地文件系统构造器
表单验证
ValidatorConstructor::make(array $data , array $rules) Validator构造器
关于框架
框架用到的组件
感谢优秀的组件开发者
- ext-mbstring
- predis/predis
- illuminate/database
- ext-sockets
- opis/closure
- league/flysystem
- ext-pdo
- dragonmantank/cron-expression
- league/climate
- filp/whoops
- ulrichsg/getopt-php
- illuminate/validation
- nikic/fast-route
- illuminate/contracts
- illuminate/view
- swoole/ide-helper
框架性能表现
测试环境:Ubuntu22.0.4 LTS
测试硬件:虚拟机(VirtualBox) 6c6t , 8192M ,开启虚拟化支持
测试工具:ApacheBench
注:不要太在意性能,真正的业务逻辑往往是复杂的,对demo进行压测并不能表明什么(图个乐)
如果好用可以点个star,如果有问题请提issue,作者会积极维护
更新于2022-12-28 16:01
常见问题
git clone下来之后怎么跑不了?
请先运行一遍composer install
All versions of watishweb with dependencies
predis/predis Version ^2.0
illuminate/database Version ^9.43
ext-sockets Version *
opis/closure Version ^3.6
league/flysystem Version ^3.0
ext-pdo Version *
dragonmantank/cron-expression Version ^3.3
league/climate Version ^3.8
filp/whoops Version ^2.14
ulrichsg/getopt-php Version ^4.0
illuminate/validation Version ^9.44
nikic/fast-route Version ^1.3
swoole/ide-helper Version ~5.0.1
illuminate/contracts Version ^9.46
illuminate/view Version ^9.46
illuminate/filesystem Version ^9.51