imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。它支持 HttpApi、WebSocket、TCP、UDP、MQTT 服务的开发。特别适合互联网微服务、即时通讯聊天im、物联网等场景!QQ群:17916227
OTHER License
Published by Yurunsoft almost 5 years ago
上周做了 Http2 的支持,从服务端开发到客户端调用,imi、YurunHttp 都已实现支持 Http2 协议。
本周正式发布 gRPC 协议的服务开发、gRPC 客户端、gRPC 连接池。
为了让大家更好上手 imi 框架,今天正式推出《imi 框架新手入门视频课程》👍,每周至少更新一集。
课程地址:https://space.bilibili.com/768718/channel/detail?cid=94514
入门课程完全免费!完全免费!完全免费!
Published by Yurunsoft almost 5 years ago
新增强大的定时任务功能 (文档传送门)
新增支持 Http2 服务开发
新增 Http2、gRPC 相关常量到 MediaType、RequestHeader
支持应用上下文读写,支持只读写入
新增支持获取当前代码运行在何种进程中(master、manager、worker、task_worker、process)
新增支持正则路由(#31)
支持自定义错误级别,将错误转为异常捕获
HttpErrorHandler 中使用服务器上文容器获取执行器实例
支持注入修改默认的 ActionMiddleware
支持给容器对象类手动绑定
进程退出自动释放资源
事件监听、取消监听支持传入数组指定多个事件
新增支持在注解设定进程是否默认启用协程
优化 parseDotRule 性能 (#32)
修复会获取到不应该存在的请求头问题
修复锁不在同一个协程无法解锁的问题
Published by Yurunsoft almost 5 years ago
2019年度最受欢迎中国开源软件评选,投一票 imi 吧,谢谢!
https://www.oschina.net/project/top_cn_2019#imi
新增支持通过beans注入配置,随服务启动进程
新增 @PoolClean 注解,可以在 Tool、Process 的入口方法上使用,用于剔除或保留指定连接池
新增支持连接池心跳机制,支持设置当获取资源时是否检测连接状态
优化 Statement 的写入和清理机制
优化视图处理性能
优化动作执行参数处理效率
热更新不占用连接池
优化模型转数组性能
process/start 工具,现在的返回码是进程返回的
优化:关闭连接池时停止心跳,并且清空资源池
连接池的自动GC和心跳,在非 worker 进程中,只要有协程运行就能启用
Published by Yurunsoft almost 5 years ago
新增一个中间件,支持当单个请求超过最大执行时间,触发超时处理
新增支持 WebSocket、TCP、UDP 的路由未找到处理
优化 Http 未找到路由处理
优化模型,update() 时不更新主键值
优化当监听端口时,自动启用http、websocket协议
修复将statement设为可用的问题
修正 ExtractData 注入目标
修复 Request->getUri() 协议无法识别 http/https/ws/wss 问题
Published by Yurunsoft almost 5 years ago
重构 RequestContext,使用 Swoole 内置的协程上下文管理方法实现。同时废除 create、destroy、exists 方法
优化测试用例服务器在多核情况下的启动效率
优化一些代码
修复模型增删改查字段名为关键字的问题
修复联合主键的模型使用 find() 方法的问题
修复模型 update() 方法可能存在的问题
修复控制器单例模式问题
Published by Yurunsoft almost 5 years ago
紧急修复单例控制器问题
Published by Yurunsoft almost 5 years ago
新增支持查询器别名,减少查询器连贯操作重复构建步骤
新增超全局变量 Hook,将 @app.beans.SuperGlobals.enable
配置为 true
,即可在代码中直接使用:$_GET、$_POST、$_COOKIE、$_REQUEST、$_SESSION、$_SERVER、$_FILES
新增模型 Meta
类,用于在模型类中方便获取模型相关信息
Http/TCP/UDP/WS 控制器支持设定是否为单例模式
新增 Model::dbQuery()
方法,查询结果为数组而不是当前类实例对象
新增 @ServerInject
注解
优化模型代码
去除无用代码
废除旧的 gzip 响应方法,优化代码
移除 Log traceMinimum
修复分页查询,页码不为 1 时,总记录数和总页数显示为 0 的问题
修复模型 parseSaveData
事件中,修改 data 值会改变模型属性值问题
Published by Yurunsoft about 5 years ago
又周五了,最近学习 imi 的用户越来越多,imi 也在变得越来越好。预祝大家周末快乐~
以下是此次更新日志:
新增模型性能测试
新增 Redis 模型测试用例
模型生成工具新增-entity
参数,是否开启使用驼峰命名,默认开启 (#27)
完善 Redis 模型方法返回值
当连接池不使用负载均衡(只有1个连接配置)时,直接返回资源
优化模型
优化测试用例
将树形模型的 getAssocList() 封装为 ArrayUtil::toTreeAssoc() 通用方法
修复 Session Cookie lifetime 设为 0 无效问题
修复使用 Redis 模型时,调用 ModelManager::getFields() 的问题
修复 ArrayUtil::recursiveMerge(),合并以数字为键的数组时,丢失键的问题
Published by Yurunsoft about 5 years ago
本周主要推出了一个进程池和高性能协程服务器,相比传统模式,即便是跟 BASE 模式相比,也有非常大的性能提升。
新增支持高性能 Swoole 协程服务器,性能更加强悍,需要 Swoole 4.4+
新增一个可以替代 Swoole\Process\Pool 的更强大的进程池。支持信号监听、重启进程(可指定)、Pool Master 与 Worker 消息通讯等。
支持在项目中配置 imi 启用哪些功能模块
Published by Yurunsoft about 5 years ago
本周主要优化了框架底层、请求上下文处理性能,另外做了一些功能上的小增强。
测试用例做到全覆盖: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() 支持传入初始化参数
Published by Yurunsoft about 5 years ago
本周主要新增了门面(Facade),以及性能有优化提升。
新增支持 Facade 门面
新增 generate/facade 工具
支持定义中间件分组
IHttpNotFoundHandler->handler() 方法增加 $requesthandler 参数
RequestContext create 方法支持传入初始数据,新增 muiltiSet 方法用于批量写入值
新增注解类转注释文本的方法
支持通过配置,指定服务器事件是否监听,以及自定义事件监听
提升框架底层使用频率较高的事件性能
提升触发未监听事件的性能
优化 http-message 相关实现代码
未初始化完成时挂起请求,改为拒绝请求
废除 BufferFull、BufferEmpty 事件
更新 doctrine-annotations 版本,合并官方 1.7 版本
修复数据库操作 errorInfo() 有时获取信息为空的问题
修复非对象方法的路由设置问题
避免 Swoole 4.4.x 下的一个奇怪 bug
Published by Yurunsoft about 5 years ago
新增 Inherit
注解,用于在子类中继承父级注解,可指定继承哪些注解,支持:类、方法、属性、常量
新增 OptionsMiddleware
,解决了使用 application/json
请求时,浏览器会先发送一个 OPTIONS
请求问题
新增 IMI.HOTUPDATE.BEGIN_BUILD
事件,可以影响热更新 build 操作
新增 Imi\Util\ClassObject::inNamespace()
方法用于判断某类是否在指定命名空间下
新增一个枚举文件方法,支持自定义是否进入目录继续遍历
中间件默认加上 Bean
名称,可以在使用时,直接使用 Bean 名称
http 动作方法参数值支持自动传入 parsedBody()
中的值
提升热更新遍历文件性能
热更新检测时间间隔支持毫秒级,单位依然是秒,传小数即可
优化生成出的模型的属性注释
修复设置 Bean 名称后,在 beans 配置中使用类名注入无效问题
修复 SessionCookie
的 httponly
配置无效问题
修复增量更新问题
Published by Yurunsoft about 5 years ago
本周主要针对模型做了增强。
这周有一个基于 imi 的开源项目正在开始立项研发,如有兴趣参与可以联系宇润!
查询总记录数、总页数:
$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,
]
文档:https://doc.imiphp.com/components/orm/TreeModel.html
模型 getter 方法引用返回现在变得有意义了
模型字段驼峰命名缓存优化,性能提升
Published by Yurunsoft about 5 years ago
本周的更新,第一阶段的单元测试编写工作完成。
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 开始
Published by Yurunsoft about 5 years ago
开源协议从 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 的配置,都可以通过系统环境变量配置
Published by Yurunsoft about 5 years ago
模型 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 报错问题
本周主要针对注解、路由底层数据关系存储做了重构,把原本的数组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 重构,使用对象替换键值数组
新增 Lock 快捷类
新增 Atomic 进程锁
新增 Lock 测试用例
新增 Lock Annotation 测试用例
Lock 接口强类型定义
支持配置定义 Lock,根据 lockId 操作
修复 tryLock() 执行回调时,不返回 boolean 问题
MemoryTable 支持使用类来定义结构
支持在配置中设定 MemoryTable
新增 MemoryTable 测试用例
修复 MemoryTableManager 问题
重构,现在ConnectContext不再本地存储数据,不再怕多个worker进程同时去读写
新增 ConnectContext 锁支持,现在读写数据不会冲突,必须设置锁,升级请注意!
新增内存表 ConnectContext Handler 支持
新增 RedisHash Handler defaultHashKey
新增缓存测试用例
新增缓存注解测试用例
修复 Cache Redis/RedisHash Handler 返回值问题
修复 Cache File delete() 不删除 .ex 文件问题
修复 Cache File clear() 无返回值问题
修复 Cache File getMultiple() 方法返回键为数字问题
新增 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() 返回值问题
Published by Yurunsoft over 5 years ago
海量提升热更新性能,注解、代码的热更新从秒级变为 毫秒级
小幅提升冷启动性能
增加文件上传测试用例
修复 Db Statement 缓存释放问题
修复 Inotify 热更新问题
Published by Yurunsoft over 5 years ago