更新说明
时隔将近一个月时间,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:https://github.com/imiphp/imi/releases/tag/v2.1.48
增强
- 支持 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 日首次发布以来,已经稳定运行在许多项目中,例如文旅电商平台、物联网充电云平台、停车云平台、支付微服务、短信微服务、钱包微服务、卡牌游戏服务端和数据迁移服务(虎扑)等项目。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。