关于 bitrix-performance
面向 Bitrix 开发者的性能优化技能,涵盖复合页面、数据库查询、读副本、缓存与会话。提供具体 API、配置指引和上线检查清单。
主要功能
- 01复合页面动态区域
- 02查询与 ORM 优化
- 03批量数据库写入
- 04读副本读取时固定主库
- 05性能部署检查清单
适用场景
- 01避免个人数据进入复合缓存
- 02减少 N+1 查询和重复读取
- 03将写后读取查询路由到主库
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bxmaximum/ bitrix-framework-skills --skill bitrix-performance安装后在 Claude Code 中输入/bitrix-performance确认已加载。
详细介绍
性能
基线:main 23.0+ · 已验证:main 26.800.0
缓存本身:bitrix-caching。SQL 分析:bitrix-database(SqlTracker)。会话:bitrix-sessions。
复合缓存
页面的静态 HTML 从复合缓存提供(NGINX 可以直接提供);动态区域通过后续请求获取。在“设置 → 复合站点”中启用。内核:Bitrix\Main\Composite\Engine、Page、StaticArea、BufferArea。
在组件模板中($this 是 CBitrixComponentTemplate):
$this->setFrameMode(true); // template is composite-compatible
$frame = $this->createFrame()->begin('Loading…'); // stub shown in the cached HTML
echo htmlspecialcharsbx($arResult['USER_NAME']); // dynamic content
$frame->end();
较长的占位标记:begin() → 动态内容 → beginStub() → 占位 HTML → end()。
在组件外(站点模板头部、init.php 助手):
use Bitrix\Main\Composite\StaticArea;
$area = new StaticArea('vendor_cart_counter');
$area->setStub('<span>0</span>');
$area->startDynamicArea();
echo (int)$basketCount;
$area->finishDynamicArea();
- 无需编写代码即可按组件切换:参数
COMPOSITE_FRAME_MODE(A/Y/N)和COMPOSITE_FRAME_TYPE(AUTO、STATIC、DYNAMIC_WITH_STUB、DYNAMIC_WITHOUT_STUB)。 - 排除某个页面:
\Bitrix\Main\Composite\Page::getInstance()->markNonCacheable()。 - 不存在
data-dynamic属性,也不存在composite_frame_mode页面属性。 - 静态部分绝不要保留个人数据(姓名、购物车、权限、CSRF 令牌)。以访客和用户身份分别测试每个动态区域。
查询
- 只选择所需字段;为
filter/order中使用的列建立索引。 - 避免 N+1:使用
fetchCollection()+fill(),或在select中使用关系(bitrix-orm)。 - 使用批量写入(
addMulti、updateMulti),而不是逐行循环。 - 对重复读取使用 ORM 查询缓存;对组装结果使用带标签的数据缓存。
只读副本
使用 cluster 模块时,query() 中的 SELECT 可能会发往从库。为保证写入后读取主库:
$pool = \Bitrix\Main\Application::getInstance()->getConnectionPool();
$pool->useMasterOnly(true);
try
{
$row = OrderTable::getById($id)->fetch();
}
finally
{
$pool->useMasterOnly(false);
}
额外数据库(分析、报表):在 connections 中使用命名连接(bitrix-database)。
检查清单
- 已分别以访客和登录用户身份检查每个复合动态区域。
- 生产环境中由 NGINX 提供复合缓存。
- 已使用 SqlTracker 找出慢查询并为其建立索引。
- 在负载下,缓存和会话使用 Redis/Memcached,而不是文件。
评论
支持 Markdown