imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。它支持 HttpApi、WebSocket、TCP、UDP、MQTT 服务的开发。特别适合互联网微服务、即时通讯聊天im、物联网等场景!QQ群:17916227
OTHER License
Bot releases are visible (Hide)
Published by Yurunsoft over 2 years ago
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';
}
Published by Yurunsoft over 2 years ago
修复非协程环境中全局捕获异常的日志记录
修复非 Swoole 环境的数据库和 Redis 重连问题 #245
Published by Yurunsoft almost 3 years ago
swoole-cli 支持 (#247)
组件自动发版 (#250)
优化 Imi::getNamespacePath()
优化匿名函数使用 static
严格区分 IQuery、IModelQuery 类型
兼容在 swoole-cli 下使用 jwt 组件 (#249)
jwt 组件依赖设置为安全的版本
优化了一些代码
修复出现异常时,IMI.COMMAND.AFTER 不触发的问题
修复模型设为非 bean 类时,关联模型无效的问题
修复关联模型 AutoSelect 设为 false 时,AutoDelete 不生效的问题 (#248)
Published by Yurunsoft almost 3 years ago
// 执行 SQL 并返回受影响的行数
// public static function exec(string $sql, array $bindValues = [], ?string $poolName = null, int $queryType = QueryType::WRITE): int
$rows = Db::exec('update tb_xxx set age=111 where id=?', [123]);
// 执行 SQL 返回结果
// public static function select(string $sql, array $bindValues = [], ?string $poolName = null, int $queryType = QueryType::WRITE): ?IResult
$result = Db::select('select * from tb_xxx id=?', [123]);
var_dump($result->getArray()); // 更多用法参考文档
// 预处理
$stmt = Db::prepare('select * from tb_xxx id=?');
$stmt->execute([123]);
var_dump($stmt->fetchAll()); // 更多用法参考文档
数据库操作增加断线错误码判断,自动关闭连接
引入 Rector 提升代码质量
优化关闭数据库连接时清理事务计数
优化了一些代码
修复模型 json 类型字段值不能为 null 的问题
修复 Swoole MySQL 驱动特殊情况获取错误信息的问题
Published by Yurunsoft almost 3 years ago
2022 年来了,imi 2.0 经历漫长的开发过程,正式发布后又持续迭代了 5 个多月,目前已经比较稳定。
现公布 imi 2022 年计划:
选择 imi 开发项目,你不用担心旧版本会被抛弃,就是放心~
最后,祝大家元旦快乐,新年快乐,脱单暴富不加班~
优化 scanVendor
[workerman] 所有使用 Workerman\Worker 地方改为 Imi\Workerman\Server\WorkermanServerWorker
拆分框架与组件的 phpstan 测试
优化开发环境加载和依赖关系
去除无用代码
修复模型 json 类型字段,解析出非数组时,字段值是字符串
修复 CronTask->getRedisPool() 返回值类型
修复数据库 escape
[workerman] 修复没有使用 workerman-gateway 但配置了 registerAddress 的报错
[workerman] 修复 Workerman 修改全局变量 $argv 导致后续使用该变量产生的问题
修复 PHP 8.x 组件兼容问题
修复 PHP 8.0 RequestProxy、ResponseProxy 静态方法调用的报错
Published by Yurunsoft almost 3 years ago
[workerman-gateway] 支持在非 worker 进程自动设置注册中心地址
支持设置全局软删除字段名 (#235)
支持全局设置分页转数组后的字段名 (#235)
环境变量读取增强 (#236)
[pgsql] 修复 PHP 8.1 兼容
[queue] 修复配置了 QueueConsumer 但没配置队列时,消费进程频繁退出重新运行
修复模型查询指定字段名的查询结果,序列化的驼峰命名不生效问题
Published by Yurunsoft almost 3 years ago
默认异常处理器支持设置响应的 http code (#221)
支持原生注解只传一个默认值的写法
模型关联查询 with 回调新增第二个参数 $annotation (#225)
模型新增支持引用字段特性 (#233)
代理类支持 PHP 8.1 交集类型 (#234)
优化禁用 HTTP 中间件的执行逻辑
优化模型关联 X 对一查询性能
优化 Imi::eval() 目录可写权限判断
添加统一格式约束
格式化 tab 为 空格 (#222)
更改文档中的 php 版本 (#224)
优化定义注解时,Parser 不是必须定义的,默认为 NullParser (#231)
改进启动信息展示 (#230)
修复模型 getter、setter 缓存问题
修复 PolymorphicToOne、PolymorphicToMany
修复 Imi\Bean\ReflectionUtil::allowsType() 检查联合类型
修复注入 mixed 类型方法出错 (#232)
Published by Yurunsoft almost 3 years ago
ArrayData->set() 增加第三个参数是否合并,保持兼容性默认合并
支持将模型设为非 bean 类 (#218)
支持禁用 HTTP 中间件 (#220)
优化模型性能 (#218)
优化 TBeanRealClass::__getRealClassName() (#218)
减少包依赖 (#217) (@NHZEX)
修改文档中关于组件进程池-imi $processPool->on(Message)的注释错误 (#216) (@beiqil-ban)
修复配置中的数组被合并的问题
Full Changelog: https://github.com/imiphp/imi/compare/v2.0.13...v2.0.14
Published by Yurunsoft almost 3 years ago
Published by Yurunsoft almost 3 years ago
完成 PHP 8.1 兼容 (#206)
模型关联预加载 with() 查询的字段默认成为序列化字段
Model::queryRelationsList() 关联字段加入序列化
模型查询器结果 get() 方法支持 with()、withField()
新增 ComponentManager 及缓存机制 (#211)
新增 IDb->getDbType()
将 swoole-phpunit 输出到 vendor/bin 目录
关闭文档搜索自动完成 (#208)
优化 getDocComment 返回 false 时的容错
优化 trait、Model 属性统一加前缀防止冲突
优化操作模型属性的代码
优化一些代码
修复模型关联查询
修复重命名分割仓库问题
修改文档配置项为null时报错问题 (#209)
修复Header头中Authorization未传值时抛出Warning异常 (#215)
修复批量执行 SQL 误报 Invalid sql
Published by Yurunsoft almost 3 years ago
Published by Yurunsoft almost 3 years ago
热更新支持重新加载配置文件
新增 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 参数无效
Published by Yurunsoft almost 3 years ago
此版本提升了 php-fpm 下性能,模型动态切换数据库、表名和连接池名更加方便
优化工具函数 (#191)
优化 FPM 模式下访问不再每次写入扫描日志
移除早该移除的配置路由,优化路由解析代码
生成的 Bean 类代码,加上强类型严格模式声明
优化 ExtractData 注解改为初始化路由时缓存
部分场景 JSON 操作出错抛出异常、不转义“/”和 Unicode
修复 joinRaw #192
修复 imi-hprose 依赖问题
修复 imi-access-control 强类型
修复 RedisHashCache 序列化兼容问题
修复 AMQP 删除消息
修复 AMQP Redis 序列化兼容问题
Published by Yurunsoft almost 3 years ago
修复 AMQP 删除消息
修复 PolymorphicManyToMany 排序不生效
修复 PolymorphicToOne 关联模型不能指定相对名称
修复 imi-hprose 依赖问题
修复代码静态检测
修复 Query->fromRaw()
修复 AMQP Redis 序列化兼容问题
修复 RedisHashCache 序列化兼容问题
Published by Yurunsoft almost 3 years ago
2.0 文档全新改版:https://doc.imiphp.com/v2.0/
新增支持 Redis Stream 消息队列实现 by @Yurunsoft in https://github.com/imiphp/imi/pull/184
自定义进程支持触发热重启 by @NHZEX in https://github.com/imiphp/imi/pull/182
新增支持 Apcu 缓存驱动 by @Yurunsoft in https://github.com/imiphp/imi/pull/183
文件缓存支持使用键名作为文件名
添加文档构建文件,方便本地测试 by @NHZEX in https://github.com/imiphp/imi/pull/188
fpm 模式不再缓存命令行数据
缓存 PaginateResult->getList() 结果
将一些 Bean 类 recursion 设为 false
修复权限控制组件 Role::create() by @cyycler in https://github.com/imiphp/imi/pull/186
修复 Swoole PgSQL 两个冒号指定类型错认为参数的问题
修复 fpm 生成运行时缓存到 cli 的问题
修复 MQTT 接收请求报错问题
Published by Yurunsoft about 3 years ago
trigger_error warning 改 Log
使用 spl_object_id 替代 spl_object_hash
固定依赖项 symfony/polyfill-php80 (#175)
优化注释,尽可能使用 inheritDoc 注释
为有 __toString() 方法的类增加 Stringable 接口
兼容 Swoole 下 Worker::getWorkerNum()、Worker::getTaskWorkerNum() 类型问题
删除无用代码
优化一些代码
修复 RoadRunner 响应对象可写检测、下载文件
修正 RedisQueueDriver、AMQPQueueDriver 的 pop 方法定义
修复 Inotify 热更新新增目录中的文件修改,没有监听的问题
Published by Yurunsoft about 3 years ago
新增支持 Async 异步执行注解 (#174)
新增支持泛型注释,增强IDE提示能力 (#166)
实现IDE助手文件生成 (#170)
命令行参数新增 MIXED 类型支持
command 实例支持 aop 触发 (#167)
Lock 注解定义支持复用配置及其他优化增强 (#169)
Bean 注解支持限制生效的环境,同时引入多个环境的组件,同名 Bean 不再冲突
FPM 模式支持 PATH_INFO,增强 https 判断
模型关联对多查询支持 limit 参数指定查询记录数量 #173
改进 imi 框架开发时的并发安装 (#168)
改进WSL检测 (#171)
优化验证帮助类 (#172)
当 CommandAction 注解没有指定 description 时,自动取注释介绍
修复 RoadRunner 不指定 workDir 无法启动问题
修复 RoadRunner 初始化问题
修复 HtmlView 偶现第一次访问报错问题
修复依赖问题
Published by Yurunsoft about 3 years ago
Published by Yurunsoft about 3 years ago
Published by Yurunsoft about 3 years ago
支持在定义 Bean 时指定当前类实例化时,禁用递归依赖
AMQP 长连接分布式解决方案 (#160)
新增支持 RoadRunner 容器 (#164)
完善权限控制组件权限操作代码 (#161) (#163)
所有组件仓库自动关闭 PR,引导到主仓库提交
优化中间件、Dispatcher代码
移除不必要代码
优化执行命令的参数拼接
Use apcu instead of apc (#159)
修复 Cron client 关闭问题
修复 AOP 动态规则添加不清除缓存的问题
修复队列消费者协程设为0,停止服务时错误 #I4BVQ5
修复 Swoole pgsql 绑定值问题
修复 PR 推送到子仓库后,Author 变成 Github 的问题
修复 imi-access-control model建表语句是空白的问题