bitrix-pull について
bitrix-pullは、BitrixアプリのリアルタイムなUI更新を扱う開発スキルです。PHPでのイベント送信、監視タグ、JavaScriptの購読、モバイルプッシュを説明し、通知と永続的なバックグラウンド処理を区別します。
主な機能
- 01ユーザーやチャンネルへのイベント送信
- 02CPullWatchタグによる監視者への通知
- 03JavaScriptでのコマンド購読
- 04モバイルプッシュ通知の送信
- 05キュー配信とCLIワーカーの処理
活用シーン
- 01項目の変更後にUIを更新
- 02レコードの監視者へ通知
- 03モバイルのバッジを更新
- 04ワーカーからクライアント更新を起動
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ bxmaximum/ bitrix-framework-skills --skill bitrix-pullインストール後、Claude Code で/bitrix-pullを入力して読み込まれたか確認します。
詳細
リアルタイムプル(pull)
基準:main 23.0+ · 検証済み:pull 26.100.0、main 26.800.0
pull は、プッシュサーバーを通じてブラウザーとモバイルアプリに短いコマンドを配信します。サーバーが設定されている必要があります(CPullOptions::GetQueueServerStatus())。モバイルプッシュには CPullOptions::GetPushStatus() も必要です。
| 仕組み | 用途 |
|---|---|
| Pull | 即時の UI 通知:「行 42 が変更されました」、カウンター |
Messenger / agents(bitrix-background-jobs) | リトライを伴う永続的な処理。UI の更新が必要な場合は、ワーカーから Pull を送信します |
PHP から送信する
\Bitrix\Main\Loader::includeModule('pull');
$ok = \Bitrix\Pull\Event::add([$userId, $otherUserId], [
'module_id' => 'vendor.module', // lower-cased by the kernel
'command' => 'itemUpdated',
'params' => ['id' => $itemId], // IDs and flags only; load data via AJAX afterwards
// 'expiry' => 86400, // seconds, default
]);
if (!$ok) {
$error = \Bitrix\Pull\Event::getLastError();
}
- 受信者:ユーザー ID、32 文字のチャンネル ID、または
Bitrix\Pull\Model\Channel。第 3 引数は\CPullChannel::TYPE_PRIVATE(デフォルト)またはTYPE_SHAREDです。 - ユーザーごとのパラメーター:
'user_params' => [$userId => ['unread' => 3]](そのユーザーのparamsにマージ)、'dictionary' => [...](全員にマージ)。結果の信頼性が保証されるのは pull 26.100 以降です。それ以前は、これらのキーに対する偽の結果は失敗を意味しません。getLastError()を確認してください。 - ペイロードのどこかに無効な UTF-8 が含まれていると、
falseが返されます(EVENT_BAD_ENCODING)。 - 配信はキューに登録され、リクエストの終了時にバックグラウンドジョブによって送信されます。長時間実行する CLI ワーカーでは、
add()の直後に\Bitrix\Pull\Event::send()を呼び出してください。
タグ(CPullWatch)
\CPullWatch::Add($userId, 'VENDOR_ITEM_' . $itemId); // when rendering the page
\CPullWatch::AddToStack('VENDOR_ITEM_' . $itemId, [ // later, to all watchers
'module_id' => 'vendor.module',
'command' => 'itemUpdated',
'params' => ['id' => $itemId],
]);
Add()は現在のユーザーに対してOnAfterEpilogで書き込まれます。別のユーザーに対して、または Web リクエストの外で実行する場合は、第 3 引数にtrue(即時)を渡してください。- ウォッチの有効期間は約 30 分です。ページでは
BX.PULL.extendWatch(tag)を使って有効状態を維持します。 AddToStack()はタグの配列とskip_usersを受け付けます。
JS でサブスクライブする
rel に pull.client を追加します(import { PULL } from 'pull.client'、グローバル変数は BX.PULL)。moduleId は小文字である必要があります。
// With command: (params, extra, command, info)
const off = BX.PULL.subscribe({
moduleId: 'vendor.module',
command: 'itemUpdated',
callback: (params, extra, command) => reload(params.id),
});
// Without command: one object for every module command
BX.PULL.subscribe({
moduleId: 'vendor.module',
callback: (data) => { /* data.command, data.params, data.extra */ },
});
BX.PULL.extendWatch('VENDOR_ITEM_' + itemId);
off(); // unsubscribe
- ハンドラーオブジェクト:
BX.PULL.attachCommandHandler({ getModuleId: () => 'vendor.module', handleItemUpdated(params, extra) {} })— メソッドhandleと先頭を大文字にしたコマンドを使用するか、getMap()を使用します。 - Vue:
mountedでthis.$Bitrix.PullClient.get().subscribe(...)を呼び出し、返された関数をunmountedで呼び出します(bitrix-vue)。 - Pull のグローバル
protobufは使わないでください。pull 26.100 以降は最小構成のビルドのため、load、parse、Root、Typeは削除されています。独自の protobufjs をバンドルし、globalThis.protobufに割り当てないでください。Pull はglobalThis.protobuf.roots['push-server']を読み取ります。
モバイルプッシュ
\Bitrix\Pull\Push::add($users, ['module_id' => 'vendor.module', 'push' => ['message' => 'Text', 'params' => [...]]]) は、プッシュ用のカーネルエントリーポイントです(command/params を破棄します)。または、両方を送信するには Event::add() に push/pushParamsCallback を追加します。CPullStack はレガシーです。
バッジの更新:Push::add($userId, ['module_id' => 'pull', 'push' => ['badge' => 'Y']])。CPushManager::sendBadges() は pull 26.0 で削除され(致命的エラー)、MobileCounter::send() は何もしません。Push::add() の呼び出しはすべてのバージョンで動作します。
チェックリスト
- PHP と JS で
module_id/commandが同一である(モジュール名は小文字)。 - ペイロードを小さくし、UTF-8 を使用する。大きなデータは必要に応じて取得する。
- タグ:レンダリング時に
CPullWatch::Addを呼び出し、JS でextendWatchを使用する。 - アンマウント/破棄時にサブスクリプションを解除する。
- Pull をジョブキューとして使わない。