imi

imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。它支持 HttpApi、WebSocket、TCP、UDP、MQTT 服务的开发。特别适合互联网微服务、即时通讯聊天im、物联网等场景!QQ群:17916227

OTHER License

Downloads
54.5K
Stars
1.2K
Committers
38

Bot releases are hidden (Show)

imi - 双重惊喜:gRPC 服务开发支持&入门视频课程

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

入门课程完全免费!完全免费!完全免费!

更新日志

新增

  • 新增支持 gRPC 服务开发
  • 新增支持 gRPC 客户端服务调用
  • 新增 gRPC 连接池
  • 新增单例 Http 控制器基类,支持使用 $this->request、$this->response,对象内部协程上下文自动切换
  • 新增完全免费的《imi 框架新手入门视频课程》

优化

  • 优化 Http 动作中间件
  • 优化测试代码

修复

  • 修复若干小问题
imi - 新增强大的定时任务功能

Published by Yurunsoft almost 5 years ago

新增

  • 新增强大的定时任务功能 (文档传送门)

  • 新增支持 Http2 服务开发

  • 新增 Http2、gRPC 相关常量到 MediaType、RequestHeader

  • 支持应用上下文读写,支持只读写入

  • 新增支持获取当前代码运行在何种进程中(master、manager、worker、task_worker、process)

  • 新增支持正则路由(#31)

  • 支持自定义错误级别,将错误转为异常捕获

优化

  • HttpErrorHandler 中使用服务器上文容器获取执行器实例

  • 支持注入修改默认的 ActionMiddleware

  • 支持给容器对象类手动绑定

  • 进程退出自动释放资源

  • 事件监听、取消监听支持传入数组指定多个事件

  • 新增支持在注解设定进程是否默认启用协程

  • 优化 parseDotRule 性能 (#32)

修复

  • 修复会获取到不应该存在的请求头问题

  • 修复锁不在同一个协程无法解锁的问题

imi - 新增连接池心跳机制

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 进程中,只要有协程运行就能启用

imi - v1.0.18

Published by Yurunsoft almost 5 years ago

新增

  • 新增一个中间件,支持当单个请求超过最大执行时间,触发超时处理

  • 新增支持 WebSocket、TCP、UDP 的路由未找到处理

优化

  • 优化 Http 未找到路由处理

  • 优化模型,update() 时不更新主键值

  • 优化当监听端口时,自动启用http、websocket协议

修复

  • 修复将statement设为可用的问题

  • 修正 ExtractData 注入目标

  • 修复 Request->getUri() 协议无法识别 http/https/ws/wss 问题

imi - 优化及修复问题

Published by Yurunsoft almost 5 years ago

新增

  • 启动提示新增网卡ip显示,优化启动提示显示 #29

优化

  • 重构 RequestContext,使用 Swoole 内置的协程上下文管理方法实现。同时废除 create、destroy、exists 方法

  • 优化测试用例服务器在多核情况下的启动效率

  • 优化一些代码

修复

  • 修复模型增删改查字段名为关键字的问题

  • 修复联合主键的模型使用 find() 方法的问题

  • 修复模型 update() 方法可能存在的问题

  • 修复控制器单例模式问题

imi - 紧急修复单例控制器问题

Published by Yurunsoft almost 5 years ago

紧急修复单例控制器问题

imi - 支持接管 $_GET、$_POST等超全局变量

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 值会改变模型属性值问题

imi - 日常迭代版本

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(),合并以数字为键的数组时,丢失键的问题

imi - 新增支持 Swoole 高性能协程服务器

Published by Yurunsoft about 5 years ago

本周主要推出了一个进程池和高性能协程服务器,相比传统模式,即便是跟 BASE 模式相比,也有非常大的性能提升。

新增

优化

  • 优化 http 路由性能,当路由数量多时效果明显

修复

  • 修复部分情况下的热更新进程残留问题
imi - v1.0.12

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() 支持传入初始化参数

修复

  • 修复在自定义进程中操作 ConnectContext、ConnectGroup 导致进程卡死问题
imi - 新增门面,提升性能

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

imi - 例行每周更新

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 配置中使用类名注入无效问题

  • 修复 SessionCookiehttponly 配置无效问题

  • 修复增量更新问题

imi - 支持树形模型、分页查询

Published by Yurunsoft about 5 years ago

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

这周有一个基于 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 版本兼容问题
imi - v1.0.8

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

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

本周具体更新日志如下:

增强

修复

  • 修复 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 开始

imi - 首个使用木兰宽松许可证的 Swoole 框架

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 的配置,都可以通过系统环境变量配置

imi - 支持模型更新自动时间戳

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 报错问题

imi -

Published by Yurunsoft about 5 years ago

更新日志

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

imi -

Published by Yurunsoft about 5 years ago

更新日志

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

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

Published by Yurunsoft over 5 years ago

增强

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

  • 小幅提升冷启动性能

  • 增加文件上传测试用例

修复

  • 修复 Db Statement 缓存释放问题

  • 修复 Inotify 热更新问题

imi - 紧急修复问题

Published by Yurunsoft over 5 years ago

  • 修复 where 条件解析 SQL 问题
  • 新增 whereEx 测试用例
Package Rankings
Top 1.63% on Packagist.org
Badges
Extracted from project README
Latest Version Php Version Swoole Version imi Doc imi License star codecov 点击加群 贡献者
Related Projects