Releases: imiphp/imi
v1.0.12
本周主要优化了框架底层、请求上下文处理性能,另外做了一些功能上的小增强。
测试用例做到全覆盖:PHP 7.1、7.2、7.3、7.4、nightly、Swoole 4.3、4.4、master
新增
-
验证注解新增支持:非必验证参数,只有当值存在才验证
-
新增 File::putContents() 方法,写入内容到文件,如果目录不存在自动创建多级目录
-
File::createFile() 新增 $content 参数
-
新增 ConnectContext::muiltiSet() 方法批量设置上下文数据
-
新增 RequestContext::use() 方法
优化
-
优化一波框架底层性能
-
优化一些请求上下文处理性能
-
优化 StatementManager
-
支持 @app.db.statement.cache 配置是否开启 statement 缓存,默认开启
-
ConnectContext::create() 支持传入初始化参数
修复
- 修复在自定义进程中操作 ConnectContext、ConnectGroup 导致进程卡死问题
新增门面,提升性能
本周主要新增了门面(Facade),以及性能有优化提升。
新增
-
新增支持 Facade 门面
-
新增 generate/facade 工具
-
支持定义中间件分组
-
IHttpNotFoundHandler->handler() 方法增加 $requesthandler 参数
-
RequestContext create 方法支持传入初始数据,新增 muiltiSet 方法用于批量写入值
-
新增注解类转注释文本的方法
-
支持通过配置,指定服务器事件是否监听,以及自定义事件监听
优化
-
提升框架底层使用频率较高的事件性能
-
提升触发未监听事件的性能
-
优化 http-message 相关实现代码
-
未初始化完成时挂起请求,改为拒绝请求
-
废除 BufferFull、BufferEmpty 事件
-
更新 doctrine-annotations 版本,合并官方 1.7 版本
修复
-
修复数据库操作 errorInfo() 有时获取信息为空的问题
-
修复非对象方法的路由设置问题
-
避免 Swoole 4.4.x 下的一个奇怪 bug
例行每周更新
新增
-
新增
Inherit
注解,用于在子类中继承父级注解,可指定继承哪些注解,支持:类、方法、属性、常量 -
新增
OptionsMiddleware
,解决了使用application/json
请求时,浏览器会先发送一个OPTIONS
请求问题 -
新增
IMI.HOTUPDATE.BEGIN_BUILD
事件,可以影响热更新 build 操作 -
新增
Imi\Util\ClassObject::inNamespace()
方法用于判断某类是否在指定命名空间下 -
新增一个枚举文件方法,支持自定义是否进入目录继续遍历
优化
-
中间件默认加上
Bean
名称,可以在使用时,直接使用 Bean 名称 -
http 动作方法参数值支持自动传入
parsedBody()
中的值 -
提升热更新遍历文件性能
-
热更新检测时间间隔支持毫秒级,单位依然是秒,传小数即可
-
优化生成出的模型的属性注释
修复
-
修复设置 Bean 名称后,在 beans 配置中使用类名注入无效问题
-
修复
SessionCookie
的httponly
配置无效问题 -
修复增量更新问题
支持树形模型、分页查询
本周主要针对模型做了增强。
这周有一个基于 imi 的开源项目正在开始立项研发,如有兴趣参与可以联系宇润!
新增
- 新增分页查询方法 Db::query()->paginate()
查询总记录数、总页数:
$page = 1;
$count = 10;
$data = Db::query()->from('xxxtable')->paginate($page, $count);
$result->getList(); // 列表数据
$result->getTotal(); // 总记录数
$result->getLimit(); // $count === 10
$result->getPageCount(); // 总页数
var_dump(json_encode($result)); // 支持序列化
// 数据格式如下:
[
'list' => [],
'total' => 100,
'limit' => 10,
'page_count' => 10,
]
不查询总记录数、总页数:
$page = 1;
$count = 10;
$data = Db::query()->from('xxxtable')->paginate($page, $count, [
'total' => false,
]);
var_dump(json_encode($result)); // 支持序列化
// 数据格式如下:
[
'list' => [],
'limit' => 10,
]
- 新增树形模型支持(getChildIds、getChildrenIds、getChildrenList、getParent、getParents、getAssocList)
文档:https://doc.imiphp.com/components/orm/TreeModel.html
- 新增支持 imi -h 命令
优化
-
模型 getter 方法引用返回现在变得有意义了
-
模型字段驼峰命名缓存优化,性能提升
修复
- 修复 Swoole 版本兼容问题
v1.0.8
本周的更新,第一阶段的单元测试编写工作完成。
imi 的单侧目前有 235 个测试用例,1035 个断言(不含独立组件)。
imi 的 travis 自动化测试涵盖了 PHP 7.1-7.3、Swoole 4.3.x、4.4.x、master。宇润和 Swoole 开发组大佬们保持着密切联系,发现问题立即反馈。所以当 Swoole 发布新版时,imi 能够很轻松地以最快速度做到兼容。
目前 imi 保持着每周一个小版本的速度进行更新迭代,各种实用组件正在开发中。
imi 组件库:https://github.com/imiphp
欢迎各路新人和大佬的加入,只要有心,就可以参与进来!
本周具体更新日志如下:
增强
-
Smarty 模版引擎组件:https://github.com/imiphp/imi-smarty
-
Swoole Tracker 服务监控组件:https://github.com/imiphp/imi-swoole-tracker
-
ArrayData、ArrayList、FilterableList 允许被 count()
-
新增 Imi\Util* 等多个类的测试用例
-
新增 File::deleteDir() 方法
-
新增 Imi\Util\Digital 工具类
修复
-
修复 Fixed Imi\Db\Query::WhereEx() 问题(@loyating #25)
-
修复 ArrayUtil::remove() 方法无法移除对象问题,新增 ArrayUtil::removeKeepKey() 方法
-
修复测试用例在低配电脑上出现的奇怪问题(Swoole v4.4.4 更新后出现)
-
修复 File::path() 拼接 xxx:// 路径问题
-
修复 Imi\Util\Imi::checkCompareValue() 判断不等于结果不正确问题
-
修复随机生成小数是科学计数格式的问题
优化
-
重构 Event,移除 KVStorage 依赖,使用类对象代替 kv 数组存储底层数据
-
优化 Http Middleware 机制
-
优化 WebSocket Middleware 机制
-
优化 TCP Middleware 机制
-
优化 UDP Middleware 机制
-
优化测试用例
-
Imi\Util\ClassObject 类注释完善
-
支持将 task_worker_num 设为 0
-
优化 AppInitReceiver
-
移除 File::readFile()、File::writeFile() 方法(Hook 协程化后用 file_get_contents()、file_put_contents() 即可)
-
移除 KVStorage
-
文件日志驱动写入时上锁
-
Query 动态参数编号全部从 1 开始
首个使用木兰宽松许可证的 Swoole 框架
更新日志
增强
-
开源协议从 Apache V2 切换为 木兰宽松许可证(Mulan PSL v1) ,更加自由!
-
增加自定义 SessionId 获取方式的测试用例(感谢 @loyating)
-
View 注解的 template 为空时默认使用当前方法名
-
新增 Imi\Util\File::isEmptyDir() 方法,判断目录是否为空
-
新增 InEnum 验证注解,用于验证值是否存在于枚举列表中
-
Request 对象增加 request()、hasRequest() 方法,request 数据包含 get/post/cookie
-
新增验证类测试用例
-
新增自动验证注解测试用例
修复
-
修复 ConnectContextRedis 导致进程阻塞的问题
-
修复 WebSocket 热重启后无法握手问题
-
修复使用 vendor/bin/imi 无法启动项目问题
优化
-
将 IMI 文字描述大写全部改为小写 imi
-
增加 HttpServer 测试用例的请求日志记录
-
WS 请求测试后将 YurunHttp Handler 切换为 Curl
-
重构 ViewHandler
-
增加测试脚本配置和运行说明,测试用例中的 MySQL、Redis 的配置,都可以通过系统环境变量配置
支持模型更新自动时间戳
更新日志
增强
-
模型 Column 注解支持 updateTime 参数,设为 true 时,当save/update时,会自动写入当前时间
支持字段类型: date/time/datetime/timestamp/year/int/bigint
当字段为 int 类型,写入秒级时间戳
当字段为 bigint 类型,写入毫秒级时间戳 -
支持使用 vendor/bin/imi 启动项目
会自动尝试加载 vendor/autoload.php,顺序如下:
工作目录
框架目录
没有则抛出错误 -
ConnectContext、Group、Session 的 Redis 驱动,默认 key 自动带上项目命名空间
-
新增 Lock->getLockCoId() 用法
-
优化热更新错误提示
-
完善 TCP 测试用例
-
优化 .travis 测试用例错误后的日志输出
-
ConnectContext 获得锁失败抛出异常
-
优化:服务器会使用,服务器配置的 beanScan 中的命名空间列表包含的控制器
修复
-
修复 Swoole 4.4.3 bug 导致的热更新报错问题
-
修复 Redis Lock 问题
-
修复 WebSocket 握手不向 RequestContext 写入 routeResult 问题
-
修复保存 WebSocket httpRouteResult 报错问题
v1.0.5
更新日志
本周主要针对注解、路由底层数据关系存储做了重构,把原本的数组kv存储,改为对象存储。内存占用更少,调用速度更快,维护更加便捷。
截止发布前,imi 兼容了最新的 Swoole 4.4.3 版本。
测试用例持续完善中,目前有 134 个测试,480 个断言。
官网 (https://www.imiphp.com/) 船新改版,感谢 @封尘 大佬~
增强
-
增加 WebSocket Server 测试用例
-
增加 TCP Server 测试用例
-
增加 UDP Server 测试用例
-
新增 Model 测试用例
-
增加 Log 测试用例
-
支持直接从 bin/imi 启动
-
新增 imiGetEnv() 函数,是 getenv() 函数的封装,支持默认值
-
generate/model 增加 basePath 参数
修复
-
修复 Model 的 save() 方法执行后,无法通过属性获取自增主键值问题
-
修复连接分组 status 未生效问题
优化
-
AnnotationManager 重构,使用对象替换键值数组
-
Route 重构,使用对象替换键值数组
v1.0.4
更新日志
Lock
-
新增 Lock 快捷类
-
新增 Atomic 进程锁
-
新增 Lock 测试用例
-
新增 Lock Annotation 测试用例
-
Lock 接口强类型定义
-
支持配置定义 Lock,根据 lockId 操作
-
修复 tryLock() 执行回调时,不返回 boolean 问题
MemoryTable
-
MemoryTable 支持使用类来定义结构
-
支持在配置中设定 MemoryTable
-
新增 MemoryTable 测试用例
-
修复 MemoryTableManager 问题
ConnectContext
-
重构,现在ConnectContext不再本地存储数据,不再怕多个worker进程同时去读写
-
新增 ConnectContext 锁支持,现在读写数据不会冲突,必须设置锁,升级请注意!
-
新增内存表 ConnectContext Handler 支持
Cache
-
新增 RedisHash Handler defaultHashKey
-
新增缓存测试用例
-
新增缓存注解测试用例
-
修复 Cache Redis/RedisHash Handler 返回值问题
-
修复 Cache File delete() 不删除 .ex 文件问题
-
修复 Cache File clear() 无返回值问题
-
修复 Cache File getMultiple() 方法返回键为数字问题
WebSocket
-
新增 WebSocket open 事件
-
WebSocket 的连接上下文创建移动到中间件执行之前,在中间件中就可以操作连接上下文
其它
-
使用 defer 实现自动释放 RequestContext
-
新增支持 redis 的 options 配置项(支持:\Redis::OPT_XXX)
-
支持设定 ServerGroup 的 status,是否启用分组
-
调整:当PoolResource->checkState()为false时,先close()再open()
-
initWorker() 中清除池和缓存对象
-
让测试用例在协程下运行
-
修复 GroupRedis、ConnectContextRedis 不等待执行完毕的就 App Inited 的问题
-
Db Statement 释放移入 Db 下
-
HttpDispatcher->dispatch() 增加返回值 Response
-
修复 AtomicManager::wakeup() 返回值问题
实现注解及代码的毫秒级热更新
增强
-
海量提升热更新性能,注解、代码的热更新从秒级变为 毫秒级
-
小幅提升冷启动性能
-
增加文件上传测试用例
修复
-
修复 Db Statement 缓存释放问题
-
修复 Inotify 热更新问题