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 visible (Hide)

imi - v2.1.0

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

本项目可以使用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';
}
imi - v2.0.22

Published by Yurunsoft over 2 years ago

优化

  • 优化模型关联更新时,先删除旧数据再更新

修复

  • 修复非协程环境中全局捕获异常的日志记录

  • 修复非 Swoole 环境的数据库和 Redis 重连问题 #245

imi - v2.0.19

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)

imi - v2.0.18

Published by Yurunsoft almost 3 years ago

增强

  • 新增 3 个 Imi\Db\Db 类便捷方法 (#243)
// 执行 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 驱动特殊情况获取错误信息的问题

imi - v2.0.17

Published by Yurunsoft almost 3 years ago

2022 年来了,imi 2.0 经历漫长的开发过程,正式发布后又持续迭代了 5 个多月,目前已经比较稳定。

现公布 imi 2022 年计划:

  • imi 2.0 很快将成为 LTS 版本,不再提供功能更新,但会长期持续提供问题修复、安全修复。
  • imi 1.3 会继续长期持续提供问题修复、安全修复。
  • imi 2.1 会随着 2.0 成为 LTS 版本后发布,带来宏定义特性,成为开发主分支,继续迭代新功能。2.1 会保持和 2.0 的兼容性,不会有大的 BC 改动,只会有功能增强。
  • imi 3.0 也正在计划中。

选择 imi 开发项目,你不用担心旧版本会被抛弃,就是放心~

最后,祝大家元旦快乐,新年快乐,脱单暴富不加班~

增强

  • 兼容 Swoole 5.0

优化

  • 优化 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 静态方法调用的报错

imi - v2.0.16

Published by Yurunsoft almost 3 years ago

增强

  • [workerman-gateway] 支持在非 worker 进程自动设置注册中心地址

  • 支持设置全局软删除字段名 (#235)

  • 支持全局设置分页转数组后的字段名 (#235)

  • 环境变量读取增强 (#236)

优化

  • 优化一些代码

修复

  • [pgsql] 修复 PHP 8.1 兼容

  • [queue] 修复配置了 QueueConsumer 但没配置队列时,消费进程频繁退出重新运行

  • 修复模型查询指定字段名的查询结果,序列化的驼峰命名不生效问题

imi - v2.0.15

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)

imi - v2.0.14

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)

  • 修复配置中的数组被合并的问题

New Contributors

Full Changelog: https://github.com/imiphp/imi/compare/v2.0.13...v2.0.14

imi - v2.0.13

Published by Yurunsoft almost 3 years ago

  • 修复 PHP 8.1 兼容引起的兼容问题
imi - v2.0.12

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

imi - v1.3.17

Published by Yurunsoft almost 3 years ago

  • 修复批量执行 SQL 误报 Invalid sql
imi - v2.0.11

Published by Yurunsoft almost 3 years ago

增强

  • 热更新支持重新加载配置文件

  • 新增 Server::getConnections()、Server::getConnectionCount() (#203)

  • 支持往模型中动态写入数据,但不支持 toArray() 和序列化

  • SQL 监听支持捕获异常

  • Workerman 环境启动支持输出 network 信息

with() 关联预加载特性

这个版本实现了模型关联查询 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.10

Published by Yurunsoft almost 3 years ago

此版本提升了 php-fpm 下性能,模型动态切换数据库、表名和连接池名更加方便

增强

  • 模型支持动态指定表名和连接池名 (#190)

优化

  • 优化工具函数 (#191)

  • 优化 FPM 模式下访问不再每次写入扫描日志

  • 移除早该移除的配置路由,优化路由解析代码

  • 生成的 Bean 类代码,加上强类型严格模式声明

  • 优化 ExtractData 注解改为初始化路由时缓存

  • 部分场景 JSON 操作出错抛出异常、不转义“/”和 Unicode

修复

  • 修复 joinRaw #192

  • 修复 imi-hprose 依赖问题

  • 修复 imi-access-control 强类型

  • 修复 RedisHashCache 序列化兼容问题

  • 修复 AMQP 删除消息

  • 修复 AMQP Redis 序列化兼容问题

imi - v1.3.16

Published by Yurunsoft almost 3 years ago

  • 修复 AMQP 删除消息

  • 修复 PolymorphicManyToMany 排序不生效

  • 修复 PolymorphicToOne 关联模型不能指定相对名称

  • 修复 imi-hprose 依赖问题

  • 修复代码静态检测

  • 修复 Query->fromRaw()

  • 修复 AMQP Redis 序列化兼容问题

  • 修复 RedisHashCache 序列化兼容问题

imi - v2.0.9

Published by Yurunsoft almost 3 years ago

增强

优化

  • 添加文档构建文件,方便本地测试 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 接收请求报错问题

imi - v2.0.8

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 热更新新增目录中的文件修改,没有监听的问题

imi - v2.0.7

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 偶现第一次访问报错问题

  • 修复依赖问题

imi - v1.3.15

Published by Yurunsoft about 3 years ago

修复

  • 修复依赖问题
imi - v2.0.6

Published by Yurunsoft about 3 years ago

  • 紧急修复获取imi命令行参数类型问题
imi - v2.0.5

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建表语句是空白的问题

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 点击加群 贡献者