更新说明
时隔将近一个月时间,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-FPM、Swoole、Workerman 和 RoadRunner 等多种容器环境下。
imi 提供了丰富的基础功能:MySQL、PostgreSQL、Redis、超强超好用的自研 ORM、连接池、Web Api、Web MVC、WebSocket、TCP Server、UDP Server、HTTP2、MQTT、gRPC、容器化(Container)、依赖注入、Aop、事件、异步(Async)、缓存(Cache)、命令行(Command)、配置化(Config)、上下文(Context)、定时任务(Cron)、门面(Facade)、验证器(Validate)、锁(Lock)、日志(Log)、定时器(Timer)、权限控制、消息队列(RabbitMQ、Kafka、Redis)、Swagger、Hprose、宏(Macro)、限流、共享内存、Smarty、雪花算法发号器(Snowflake)、Workerman Gateway、InfluxDB 和 TDengine 等组件。
同时,imi 还提供了微服务相关支持:Nacos 配置中心、etcd 配置中心、Nacos 服务注册、Nacos 服务发现、Swoole Tracker、Zipkin、Jaeger、Prometheus、InfluxDB 服务指标监控、TDengine 服务指标监控 和 负载均衡 等组件。
除此之外,imi 还提供了管理后台开发骨架 imi-admin。
imi 框架自 2018 年 6 月 21 日首次发布以来,已经稳定运行在许多项目中,例如文旅电商平台、物联网充电云平台、停车云平台、支付微服务、短信微服务、钱包微服务、卡牌游戏服务端和数据迁移服务(虎扑)等项目。
- 官网:www.imiphp.com/
- Github:github.com/imiphp/imi
- Gitee:gitee.com/yurunsoft/I…
- 技术支持:doc.imiphp.com/v2.1/base/s…