bitrix-performance について
Bitrix アプリケーションの性能改善に取り組む開発者向けのスキルです。コンポジットページ、データベースクエリ、読み取りレプリカ、キャッシュ、セッションを扱い、API例や設定指針、運用チェック項目を示します。
主な機能
- 01コンポジットページの動的領域
- 02クエリと ORM の最適化
- 03データベースの一括書き込み
- 04読み取りレプリカで主系を指定
- 05性能運用チェックリスト
活用シーン
- 01個人データのコンポジットキャッシュ混入防止
- 02N+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);
}
追加の DB(分析、レポート)には、connections 内の名前付き接続を使用します(bitrix-database)。
チェックリスト
- すべてのコンポジット動的エリアをゲストユーザーとログインユーザーの両方で確認している。
- 本番環境で NGINX がコンポジットキャッシュを配信している。
- SqlTracker で遅いクエリを特定し、インデックスを設定している。
- 負荷時には、キャッシュとセッションにファイルではなく Redis/Memcached を使用している。