支持模型自定义关联 (#463)
支持设置 Statement 最大缓存数量 (#464)
优化解决 Statement 缓存数量过多问题 (#464)
优化查询构建器的 limit()
操作值也通过预处理绑定
优化分页查询,统计记录数量时移除排序提升性能
v2.1.0
2022 年来了,imi 2.0 经历漫长的开发过程,正式发布后又持续迭代了 4 个月,目前已经比较稳定。
imi 2.0、1.3 作为 LTS 版本,为保持稳定性,持续提供问题修复、安全修复,不再提供功能更新,暂无终止维护时间表。
imi v2.1.0 带来了两个新特性:宏定义和异步日志。并且将最低支持的 Swoole 版本提升至 v4.8,PHP 版本要求保持不变,依然是 PHP >= 7.4。
顾名思义,不再需要被日志记录的 IO 拖慢接口响应,一切都是异步的。
只需要在 @app.logger
中增加:'async' => true
就可以启用。
该特性仅 Swoole 有效。
支持在 imi 框架中使用宏定义。
支持在 PHP 代码中使用类似 C/C++ 中的宏,进行代码预编译。
可以方便兼容不同版本和环境下运行的 PHP 代码。
在一些场景可以通过预定义常量,来提升性能,减少运行时判断。
本组件基于 Yurunsoft/php-macro 组件,该组件由宇润主导开发。
这是 imi v2.1.0 引入的实验性新特性
本项目可以使用composer安装,遵循psr-4自动加载规则,在你的 composer.json
中加入下面的内容:
{
"require": {
"imiphp/imi-macro": "~2.1.0"
}
}
支持的文件名:*.php
、*.macro
.php
需要在文件中任意位置顶格加入代码:
# macro
该代码不加不生效
A.php
执行时,会在相同目录生成处理后的 A.php.macro.php
。
.macro
需要创建同名的 .php
文件,如 A.php
,内容为空即可。
再创建 A.macro
编写 PHP 代码。
执行时,会在相同目录生成处理后的 A.macro.php
。
宏:#define
、#const
、#ifdef
、#ifndef
例子:
#ifndef IN_SWOOLE
# define IN_SWOOLE extension_loaded('swoole')
#endif
#ifdef IN_SWOOLE
#if IN_SWOOLE
\Co\run(function(){
echo 'hello world';
});
#endif
#endif
注意:使用宏定义的常量,仅在生成代码时有效,运行时无效
宏:#if
、#else
、#elif
、#endif
例子:
<?php
#if version_compare(\PHP_VERSION, '8.0', '>=')
function test(): string|false
#else
/**
* @return string|false
*/
function test()
#endif
{
return 'hello world';
}
PHP >= 8.0 环境下生成的代码:
<?php
function test(): string|false
{
return 'hello world';
}
PHP < 8.0 环境下生成的代码:
<?php
/**
* @return string|false
*/
function test()
{
return 'hello world';
}
热更新支持重新加载配置文件
新增 Server::getConnections()、Server::getConnectionCount() (#203)
支持往模型中动态写入数据,但不支持 toArray() 和序列化
SQL 监听支持捕获异常
Workerman 环境启动支持输出 network 信息
这个版本实现了模型关联查询 with 特性,可以减少查询次数提升关联查询性能
支持在关联注解中设置 with=true
开启自动预加载
支持在关联注解中设置 withFields={"指定序列化字段"}
支持在 Model::query()
后调用 with()
方法指定预加载的关联属性名
支持在 Model::query()
后调用 with()
方法指定预加载关联属性名对应的回调
支持在 Model::query()
后调用 withField()
指定查询出来的模型,序列化时的字段
Model::queryRelationsList() 支持预加载查询
改进开发体验 (#197)
优化 Swoole 下文件扫描性能
兼容关闭 Swoole 短名称的场景
优化 AppContexts::APP_PATH 处理为绝对路径
优化 json 错误抛出异常的容错
单元测试改进 (#202)
重构 HTTP 路由提升性能 (#200)
优化 ArrayList 类型不对应时的提示
生成模型时,将 json 类型字段的 getter 方法设为引用返回,便于修改数据
优化一些代码
修复 @app.overrideDefaultIgnoreNamespace、@app.overrideDefaultIgnorePaths 配置不生效问题
修复 Request 执行 setUri() 时会触发 initUri()
修复权限组件转为树形的问题 (#201)
修复 SessionId 为空字符串时当作正常 Session 的问题
修复空 Session Json 解析失败
修复 Swoole RedisServerUtil
修复 Workerman UDP 无法从请求上下文获取packetData
修复 ManyToMany、PolymorphicToMany、PolymorphicManyToMany 注解指定 fields 参数无效
imi v2.0 发布,PHP 长连接分布式开发框架
imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman 多种容器环境下。
imi 支持开发 Http 接口,以及 Http2、WebSocket、TCP、UDP、MQTT 等常驻内存服务。
imi 拥有丰富的功能组件,v2.0 版本内置了 2 个分布式长连接服务的解决方案。
imi 框架现在已经稳定运行在:文旅电商平台、物联网充电云平台、停车云平台、支付微服务、短信微服务、钱包微服务、卡牌游戏服务端、数据迁移服务(虎扑)等项目中。
imi 第一个版本发布于 2018 年 6 月 21 日
感谢群里抢先体验 imi 2.0,提出建议和反馈 bug 的开发者们!
感谢 @Gumo666 @NHZEX @loyating 等开发者对 imi 文档或代码的贡献!
宇润(张润宇),1994 年 3 月 12 日(植树节)出生于无锡。
初二开始就自学编程,喜欢 C#,但事与愿违,工作后一直从事 PHP 开发工作。
imi 框架创始人,Swoole 开发组成员,宇润 PHP 系列组件作者。
开源项目包括但不限于:imi、PaySDK、YurunHttp、Guzzle-Swoole、YurunOAuthLogin、ChineseUtil 等
多容器:支持 Swoole、Workerman、PHP-FPM 等
分布式:无心智负担的长连接分布式解决方案
高性能:常驻内存 + PHP 8.0 JIT
次世代:下一代 PHP 框架(与 Laravel Octane 的多容器支持理念,不谋而合)
2.0 版本目前处于测试阶段,不久之后将发布正式版本
创建 Http Server 项目:composer create-project imiphp/project-http
创建 WebSocket Server 项目:composer create-project imiphp/project-websocket
创建 TCP Server 项目:composer create-project imiphp/project-tcp
创建 UDP Server 项目:composer create-project imiphp/project-udp
PHP 8.0 原生注解(原注释写法依旧支持)
内置长连接服务分布式解决方案,助力 PHP 物联网生态
多容器支持,可以运行在 Swoole、Workerman、PHP-FPM、Cli 环境
解决痛点:beanScan、Main 类等现已是非必选项
解决痛点:PSR-7 基础上增加 setXXX 方法,保留 withXXX 并完全兼容 PSR-7
命令行包改用 symfony/console
日志组件改用 monolog/monolog
等……
废除 v1 中不合理、写法啰嗦的地方,简化配置,imi 让开发项目一把梭的理念从未改变
将一些功能,交给更加成熟的第三方包,imi 有它自己的使命
全部使用强类型、严格模式开发,保证代码质量
重构底层,让框架支持在多种服务容器下运行(Swoole、Workerman、PHP-FPM 等),方便扩展
专注提升分布式长连接服务开发体验,这是目前市面上框架的不足之处,还只是用来开发 Http 服务,这么用 Swoole 和 Workerman 简直是暴殄天物
让更多组件支持在非 Swoole 环境下运行
支持 Swow、RoadRunner 环境
长连接分布式解决方案,支持更多消息中间件、网关
更多微服务化的组件开发和深度集成
imi v2 免费视频教程、源码分析视频等
我们日常开发中使用的绝大多数软件,都是开源软件(VSCode、PHP、Nginx、MySQL、Redis 等)
宇润非常希望能有更多的人可以参与到包括 imi 在内的开源项目中来,为 PHP 生态建设献出一份力!
参与开源门槛其实不高,你的使用、反馈、建议、bug 修复、代码贡献等等,才是为开源项目添砖加瓦,我为人人,人人为我,让开源项目能够帮助到更多的人。
开源不是免费、白嫖、无私奉献,且用且珍惜……
imi v2.0 即将发布,敬请期待哦~
#98 新增支持 Redis 哨兵模式、集群模式;cache、lock、queue、rate-limit 改造兼容
imi-jwt 组件兼容支持 PHP 8.0
AMQP 组件升级
新增为一个列表查询指定关联便捷方法(\Imi\Model\Model::queryRelationsList($modelList)
)
修复组件仓库同步问题
修复 access-control 模型
修复模型指定字段查询后,序列化字段时 camel 设置无效问题
修复 AMQP 队列 pop 问题
目前 imi v2.0 版本已基本完成开发和文档编写工作,正在准备发布介绍PPT及视频。
最近把官网、文档模版、所有组件都挪到了 imi 主仓库进行维护。并且将原仓库(yurunsoft/imi)迁移至(imiphp/imi)
以后所有的 issue、Pull Request 都在 imiphp/imi 进行。
imi v2.0 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
如果有任何问题,欢迎联系我们!
修复极端情况下的 AMQP 队列 pop 问题
修复查询构建器别名功能下的绑定参数问题(可能影响软删除等功能)
imi v2.0 版本发布临近,等视频发布后,同时会有活动,抽奖赠送一些 imi 周边产品,包括印有 imi Logo 的手机壳(所有主流型号都有)、T恤
当然你也可以抢先下单体验, 支持一下 imi~
微信扫码:
目前 imi v2 版本已基本完成开发,正在进行文档编写工作。
最近把官网、文档模版、所有组件都挪到了 imi 主仓库进行维护。
以后所有的 issue、Pull Request 都在主仓库进行。
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
如果有任何问题,欢迎联系我们!
修复模型保存更新问题
修复 Entity 注解 camel 设为 false 失效问题
修复关联模型问题
修复模型查询后的序列化问题
修复因心跳导致的,偶现连接跨协程使用问题
修复在用户进程中,向客户端推送数据有警告的问题
修复生成用注释表示的方法时,默认值中有数组时的格式问题
Fix typo (#95)
目前 imi v2 版本开发进度顺利,即将进入文档编写阶段。
如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
新增 ClassObject::convertArrayToKV()、convertKVToArray()、newInstance() 方法
增加 Http 参数不存在时的异常抛出
修复 PHP 8 联合类型兼容问题
修复一处类型问题
修复启用协程的命令行工具,未初始化异步连接池的问题
修复监听事务提交事件中,开启事务并出现提交或回滚导致的死循环
目前 imi v2 版本开发进度顺利,如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
优化连接池关闭
当出错 exit 时增加 exit code 255
修复 BinderHandler
修复开启 Opcache 后热更新失效问题
修复注入返回值为 void 的方法问题
修复 deprecated 提示
修复 Swoole 4.5 下热重启错误
修复 Swoole Server start、ManagerStart、WorkerStart 事件抛出异常并捕获后,未退出进程造成的问题
目前 imi v2 版本开发进度顺利,如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
新增连接绑定器本地驱动
增强连接绑定器,支持指定处理器类
支持模型软删除 #76
新增表生成的前后置操作事件
新增分组本地驱动 GroupLocal
优化MySQL、Redis 连接重置、连接池关闭
减少打印日志时对 debug_backtrace 的调用、支持设定 Log 组件的 debug_backtrace 回溯限制 (#81)
修复 SQL 监听 #80
修复生成模型不指定 baseClass 时的“BaseClass Imi\Model\Model not extends Imi\Model\Model”错误提示
最近 PHP 界热闹了起来,也多出了很多瓜可以吃,有点意思~
目前 imi v2 版本开发进度顺利,如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
新增支持配置 JsonObjectParser、JsonArrayParser 序列化时的参数
新增 JsonEncode 注解,支持设定 JSON 类型字段序列化时的配置 (#77)
新增根据注释或声明类型,实现 Inject、RequestInject、ServerInject 的智能注入
新增 ConnectContext::getFd() 获取当前连接号
更新 generate/model 工具,支持定义生成模型所继承的基类 (#78)
优化 JsonErrorHandler 使用 JsonView 实现
优化 Group
没有已知 BUG
目前 imi v2 版本开发进度顺利,如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
imi 正式成为了码云 GVP 项目,大家也可以到码云关注下哦!(https://gitee.com/yurunsoft/IMI)
Http 路由支持 ./ 用法
Server 工具类新增:sendByFlag、sendRawByFlag、close、closeByFlag 方法
Server 工具类 send()、sendByFlag()、sendRaw()、sendRawByFlag() 支持 SWOOLE_BASE 模式跨进程推送
Server 工具类 sendToGroup()、sendRawToGroup() 支持 SWOOLE_BASE 模式跨进程推送
引入代码静态分析、格式检测
更新 .env 组件版本 #75
模型类的 save() 方法不再使用 replace 实现
优化向 WebSocket 推送时判断连接合法性
优化热更新
优化 ConnectionBinder
修复停止服务命令报错问题
修正异常内容的拼写
修复 Group isInGroup()、getFds() 方法不存在问题
目前 imi v2 版本开发进度顺利,如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
imi 正式成为了码云 GVP 项目,大家也可以到码云关注下哦!(https://gitee.com/yurunsoft/IMI)
目前已经进入无心撸码,只想放假的状态~
🏮祝大家 2021 春节快乐~
优化处理多行SQL语句时过滤空SQL
统一大小写
修复 stopServer、reloadServer
修复热重启超时问题
修复热更新缓存文件体积不断增加
修复从模型生成表
修复模型生成工具在字段类型为 json 时的问题
修复 RedisGroup->isInGroup()
修复特定情况下监听事务提交和回滚的问题
目前 imi v2 版本开发进度顺利,如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
imi 正式成为了码云 GVP 项目,大家也可以到码云关注下哦!(https://gitee.com/yurunsoft/IMI)
新增 SQL 监听功能
新增 JsonNotNull 注解
优化模型中的 find、update、delete 操作
优化 PdoMysql->exec() 返回值判断
优化 limit 不再使用参数绑定,而是转为 int 后拼接
优化 RedisManager::getNewInstance()
修复 HTTP 请求不带 host 请求头时解析报错问题
修复模型查询指定关联问题
修复 RedisModel::deleteBatch() hash 模式返回值问题
修复 PoolConfig 2个方法的返回值
修复 RedisManager::release()、Db::release()
修复在 Docker 中停止、重启服务时,如果环境没有安装 kill 命令的报错问题 #74
目前 imi v2 版本已经开始开发了(2020-09)如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
imi 正式成为了码云 GVP 项目,大家也可以到码云关注下哦!(https://gitee.com/yurunsoft/IMI)
路由注解新增 paramsBody 参数,支持从 JSON、XML 中决定路由
路由注解新增 paramsBodyMultiLevel 参数,支持指定是否为多级参数获取
新增检查 UDP 重复路由
新增检查 TCP 重复路由
新增检查 WebSocket 重复路由
新增检查 HTTP 重复路由
修复在 WebSocket OnOpen 事件中 push 失败问题
修复 Server->hasGroup()、Server->getGroup()
修复方法参数默认值判断问题
修复连接池开启心跳后,偶现的多协程使用同一个连接的问题
本版本开始已经兼容了 PHP 8.0,并且将 PHP 8.0 加入了自动化测试中。
目前 imi v2 版本已经开始开发了(2020-09)如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
imi 正式成为了码云 GVP 项目,大家也可以到码云关注下哦!(https://gitee.com/yurunsoft/IMI)
11月去医院住了两周,导致没有提交代码和发布版本,目前状态良好,恢复更新!
新增正则验证注解
新增 RequestContextProxy
新增模型关联前置和后置事件
所有新增特性都可以在 文档 里找到哦
自动化测试抛弃 travis,向 GitHub Actions 迁移
连接上下文操作增加 fd 判断
优化缓存参数key不为字符串时的错误提示
去除模型生成工具多余的参数绑定
为部分不稳定的测试增加重试
修复 RequestProxy->getAttribute()
修复 Server::sendMessage() workerID 获取不到的问题
修复 Mysqli 驱动的编码不生效问题 #71
修复 mysqli 报错:mysqli::next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method
鉴于大家的热情及需求,imi v1 版本继续进行功能性开发直至 v2 版本发布,如果有需求依然可以跟我们提哦!
目前 imi v2 版本已经开始开发了(2020-09)如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
imi 正式成为了码云 GVP 项目,大家也可以到码云关注下哦!(https://gitee.com/yurunsoft/IMI)
为 imi 投一票:https://www.oschina.net/project/top_cn_2020#imi
新增模型字段类型list
增加 protected 方法的注入和注解支持
鉴于大家的热情及需求,imi v1 版本继续进行功能性开发直至 v2 版本发布,如果有需求依然可以跟我们提哦!
目前 imi v2 版本已经开始开发了(2020-09)如果有任何问题,欢迎联系我们!
imi v2 版本最新规划及动态: https://github.com/Yurunsoft/imi/issues/66
imi 正式成为了码云 GVP 项目,大家也可以到码云关注下哦!(https://gitee.com/yurunsoft/IMI)
为 imi 投一票:https://www.oschina.net/project/top_cn_2020#imi
引入格式化代码标准
Random 工具类生成随机字符,支持只传入 $min 时使用固定长度 #68
连接池 requestResourceCheckInterval 配置项默认值从 3 改为 30,并且支持设为 null 则不限制
优化了一些代码
修复 phpunit 兼容性问题
修复 $_SERVER 部分情况下的兼容问题
修正一些错别字
这两周依然远程办公,忙于各种项目。这周更新的 Partial
很强大实用,可以看下的。
imi 视频教程已更新到第九集《模型和ORM》:https://www.bilibili.com/video/av78158909/
优化 Redis 连接池资源类
优化 Redis 连接池密码判断,现在为空字符串时,不会尝试密码登录
优化树形模型代码
优化热更新进程逻辑
imi 的 Partial
思想是从 C# 中借鉴而来。Partial
可以将一个类的部分,分成几个文件,分别书写。
截止目前最新的 PHP 7.4 版本,还未在语言层面上支持 Partial
特性。
但依赖于 imi 强大的容器对象,终于在 PHP 中实现了 Partial
特性。
使用非常简单,使用 trait
编写,加上 @Partial
注解,可以方便地注入。
多人协作开发,修改同一个类文件难免有冲突。如果事先定义好接口,将不同方法分配给几个人开发,每个人只需要在自己的文件中编写,不用担心冲突问题。
类的方法特别多,并且无法很好地拆分。这时候分到几个文件中,会相对比较好维护一些。
有一些类是通过工具生成的,如果我们在类里编写了自己的代码,又需要重新工具生成一些内容,这时候会覆盖我们编写的代码。使用 Partial
在另一个文件开发,不会被覆盖掉。
在
Partial
概念引入 imi 框架前,imi 的模型生成工具将生成代码放在父类,用户在子类中编写代码。
在家办公第一周,很快就忙了起来……
这周又有许多用户涌入 imi,每一次使用、反馈、贡献,都是在为 imi 添砖加瓦,更上一层楼。
相信,imi 会越来越好用,越来越强大!
Text 注解支持字符验证 #46 文档
新增一个控制器方法 __render()
,用于优化页面渲染开发体验 文档
定时任务支持设定,每次启动服务强制执行,Cron 注解的 force 设为 true 即可 文档
移除一处 try 语句
移除使用 eval() 函数,引入一个安全替代方法 文档
优化日志 Console 驱动输出
调整 .env 加载时机,在配置文件中支持使用 getenv()、imiGetEnv() 函数获取 #41 文档
修复模型 bit 类型字段,在部分场景下的属性值转换问题
修复模型保存后事件的参数类错误问题
修复项目在特殊路径下启动报错问题
修复 SQL 报错会出现 “Call to a member function closeCursor() on null” 错误的问题
修复模型批量更新方法中,自定义连接池名不生效的问题
修复模型注解设置 poolName 不生效问题 #40
修复模型生成工具的 poolName 参数值,没有生成到 Table 注解里的问题 #38