imi v2.1.48 发布,大表分页和数据库迁移组件史诗级增强!

62 阅读5分钟

更新说明

时隔将近一个月时间,imi 再次发版,下面我将简单介绍这段时间里 imi 的变化。

MySQL 高性能分页查询(大表分页类)

imi 的用户普遍反馈了一个问题,那就是当业务数据越来越多的情况下,后台分页查询的速度是越来越慢。为解决用户迫切的需求,开发了这个功能。(文档

MySQL 分页查询的性能一直被人所诟病,既然 MySQL 不愿意自动优化,那用户只能被迫手动优化。

分页查询性能优化的方案有很多,由于篇幅限制,不在这里详细说明了。

原理:

  • 先查出记录 id
  • 再根据 id 查询记录
// 首先准备好查询构建器
$query = Db::query()->from('xxxtable');

// 实例化大表分页类,字段名默认 id
$pagination = new \Imi\Db\Mysql\Query\Pagination\BigTablePagination($query);
// 指定主表主键字段名,如果涉及多张表关联,这里需要指定主表的主键字段名
$pagination = new \Imi\Db\Mysql\Query\Pagination\BigTablePagination($query, 'xxxtable.id');

// 只查列表,返回值同 $query->select(),Result 对象
$result = $pagination->select();
// 获取数组
$result->getArray();

// 分页查询,返回值同 $query->paginate(),PaginationResult 对象
$page = 1;
$limit = 10;
$result = $pagination->paginate($page, $limit);

仅 MySQL 数据库支持

数据库迁移组件史诗级增强

支持在生成模型时自动生成迁移文件。(文档

配置

@app.beans:

[
    \Imi\Migration\Service\MigrationService::class => [
        'handler' => \Imi\Migration\Handler\FileMigrationHandler::class, // 迁移处理器
        'onGenerateModel' => true, // 是否在生成模型时自动生成迁移文件
    ],
]

上述配置是默认配置,不配置时自动启用。

目录

.migration 是存放数据库迁移文件和版本信息的目录,请勿将 .migration/version 提交到版本控制系统。

执行数据库迁移

执行前询问:

vendor/bin/imi-swoole migration/migrate

强制执行:

vendor/bin/imi-swoole migration/migrate -f

请谨慎操作

执行数据库回滚

执行前询问:

vendor/bin/imi-swoole migration/rollback

强制执行:

vendor/bin/imi-swoole migration/rollback -f

请谨慎操作

优化内存占用

这个版本解决了一处内存泄漏以及一处内存释放不及时(非泄露)问题,服务内存占用缓慢提升的问题得到改善。

另外,imi 在 Swoole 和 Workerman 启动服务前,释放了一些不必要的变量,当然这个算蚊子肉优化了,可以忽略不计。

提前兼容 Swoole v5.1

imi 已经提前跑通未正式发布的 Swoole v5.1 版本(master 分支),并且完全兼容!

imi 增加了一个北京时间每天 0 点自动测试,主要测试 imi 在 PHP 8.2 + Swoole master 下的测试用例是否能跑通。(测试地址

目前来看,imi-pgsql 已经完美兼容 Swoole v5.1 中的 pdo_pgsql hook。

接下来大家只需要耐心等待 Swoole v5.1 的正式发版!

更新日志

Release:github.com/imiphp/imi/…

增强

  • 支持 MySQL 高性能分页查询(大表分页类) (#542)
  • 生成模型相关改进 (#537)
  • 数据库迁移组件(imi-migration),支持一种新的迁移方式

优化

  • 优化软删除查询构建器及时释放内存(非泄露) (#547)
  • 简化框架配置 (#543)
  • 优化了一些代码
  • 改进服务相关 (#541)
  • 优化启动服务命令,修复 swoole 启动服务指定 workerNum 参数无效
  • 设置 Workerman 进程名称

修复

  • 修复 Swoole 下等待连接事件执行完才执行 receive 的机制偶尔会失效 (#551)
  • 修复 ConnectionContextStore 初始化 (#552)
  • 修复可能存在的定时器未捕获错误 (#550)
  • 修复事务嵌套时,事件触发不正确 (#548)
  • 修复事件名称是动态设定时,仅触发一次的事件被执行后,有残留数据导致内存泄漏 (#546)
  • 修复 SWOOLE_PROCESS 模式获取 master 进程 pid (#545)
  • 修复生成模型基类中的 ddlDecode 值有时不正确
  • 修复配置 beanScan 后扫描命名空间错误 (#540)
  • 修复同一个目录被多个命名空间映射,扫描报错 (#540)
  • 修复 AnnotationManager 获取注解方法,传入 $onlyFirst=true 找不到注解时特定情况不返回 null (#538)
  • 修复极端情况下某些类初始化不完全 (#553)

其它

  • 完善了一些测试

  • 更新了一些文档

  • 修复覆盖率测试和偶发测试失败 (#539)

  • 修复 Windows 测试 Workerman Gateway,启动服务时端口检测不完全

  • 每天北京时间 0 点定时测试 PHP8.2 + Swoole master 分支(pdo_pgsql hook 跑通)

  • 更新 php-cs-fixer 版本 (#536)

关于 imi

imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPMSwooleWorkermanRoadRunner 等多种容器环境下。

imi 提供了丰富的基础功能:MySQLPostgreSQLRedis超强超好用的自研 ORM连接池Web ApiWeb MVCWebSocketTCP ServerUDP ServerHTTP2MQTTgRPC容器化(Container)依赖注入Aop事件异步(Async)缓存(Cache)命令行(Command)配置化(Config)上下文(Context)定时任务(Cron)门面(Facade)验证器(Validate)锁(Lock)日志(Log)定时器(Timer)权限控制消息队列(RabbitMQ、Kafka、Redis)SwaggerHprose宏(Macro)限流共享内存Smarty雪花算法发号器(Snowflake)Workerman GatewayInfluxDBTDengine 等组件。

同时,imi 还提供了微服务相关支持:Nacos 配置中心etcd 配置中心Nacos 服务注册Nacos 服务发现Swoole TrackerZipkinJaegerPrometheusInfluxDB 服务指标监控TDengine 服务指标监控负载均衡 等组件。

除此之外,imi 还提供了管理后台开发骨架 imi-admin

imi 框架自 2018 年 6 月 21 日首次发布以来,已经稳定运行在许多项目中,例如文旅电商平台、物联网充电云平台、停车云平台、支付微服务、短信微服务、钱包微服务、卡牌游戏服务端和数据迁移服务(虎扑)等项目。