Skip to content

Releases: imiphp/imi

v1.0.12

20 Sep 08:47
Compare
Choose a tag to compare

本周主要优化了框架底层、请求上下文处理性能,另外做了一些功能上的小增强。

测试用例做到全覆盖: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 导致进程卡死问题

新增门面,提升性能

12 Sep 04:59
Compare
Choose a tag to compare

本周主要新增了门面(Facade),以及性能有优化提升。

新增

  • 新增支持 Facade 门面

  • 新增 generate/facade 工具

  • 支持定义中间件分组

  • IHttpNotFoundHandler->handler() 方法增加 $requesthandler 参数

  • RequestContext create 方法支持传入初始数据,新增 muiltiSet 方法用于批量写入值

  • 新增注解类转注释文本的方法

  • 支持通过配置,指定服务器事件是否监听,以及自定义事件监听

优化

  • 提升框架底层使用频率较高的事件性能

  • 提升触发未监听事件的性能

  • 优化 http-message 相关实现代码

  • 未初始化完成时挂起请求,改为拒绝请求

  • 废除 BufferFull、BufferEmpty 事件

  • 更新 doctrine-annotations 版本,合并官方 1.7 版本

修复

  • 修复数据库操作 errorInfo() 有时获取信息为空的问题

  • 修复非对象方法的路由设置问题

  • 避免 Swoole 4.4.x 下的一个奇怪 bug

例行每周更新

06 Sep 08:14
Compare
Choose a tag to compare

新增

  • 新增 Inherit 注解,用于在子类中继承父级注解,可指定继承哪些注解,支持:类、方法、属性、常量

  • 新增 OptionsMiddleware,解决了使用 application/json 请求时,浏览器会先发送一个 OPTIONS 请求问题

  • 新增 IMI.HOTUPDATE.BEGIN_BUILD 事件,可以影响热更新 build 操作

  • 新增 Imi\Util\ClassObject::inNamespace() 方法用于判断某类是否在指定命名空间下

  • 新增一个枚举文件方法,支持自定义是否进入目录继续遍历

优化

  • 中间件默认加上 Bean 名称,可以在使用时,直接使用 Bean 名称

  • http 动作方法参数值支持自动传入 parsedBody() 中的值

  • 提升热更新遍历文件性能

  • 热更新检测时间间隔支持毫秒级,单位依然是秒,传小数即可

  • 优化生成出的模型的属性注释

修复

  • 修复设置 Bean 名称后,在 beans 配置中使用类名注入无效问题

  • 修复 SessionCookiehttponly 配置无效问题

  • 修复增量更新问题

支持树形模型、分页查询

30 Aug 05:17
Compare
Choose a tag to compare

本周主要针对模型做了增强。

这周有一个基于 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

23 Aug 07:12
Compare
Choose a tag to compare

本周的更新,第一阶段的单元测试编写工作完成。

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

欢迎各路新人和大佬的加入,只要有心,就可以参与进来!

本周具体更新日志如下:

增强

修复

  • 修复 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 框架

15 Aug 06:59
Compare
Choose a tag to compare

更新日志

增强

  • 开源协议从 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 的配置,都可以通过系统环境变量配置

支持模型更新自动时间戳

09 Aug 07:33
Compare
Choose a tag to compare

更新日志

增强

  • 模型 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

05 Aug 01:50
Compare
Choose a tag to compare

更新日志

本周主要针对注解、路由底层数据关系存储做了重构,把原本的数组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

29 Jul 03:13
Compare
Choose a tag to compare

更新日志

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() 返回值问题

实现注解及代码的毫秒级热更新

22 Jul 06:16
Compare
Choose a tag to compare

增强

  • 海量提升热更新性能,注解、代码的热更新从秒级变为 毫秒级

  • 小幅提升冷启动性能

  • 增加文件上传测试用例

修复

  • 修复 Db Statement 缓存释放问题

  • 修复 Inotify 热更新问题