proklung/bitrix.redis.module

支持在Bitrix中使用Redis队列(以及更多)

安装: 8

依赖: 0

建议者: 0

安全: 0

星标: 5

关注者: 1

分支: 0

公开问题: 0

类型:bitrix-d7-module

1.1.7 2021-08-20 05:50 UTC

This package is auto-updated.

Last update: 2024-09-20 12:31:59 UTC


README

支持的传输方式

  • Redis
  • RabbitMq
  • 文件系统
  • DBAL

安装

主项目的composer.json

  "extra": {
    "installer-paths": {
      "./bitrix/modules/{$name}/": ["type:bitrix-d7-module", "type:bitrix-module"],
      "./bitrix/components/{$name}/": ["type:bitrix-d7-component", "type:bitrix-component"],
      "./bitrix/templates/{$name}/": ["type:bitrix-d7-template", "type:bitrix-theme"]
    }
  }

    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/proklung/bitrix.redis.module"
        },
        {
          "type": "git",
          "url": "https://github.com/proklung/bitrix.containerable.boilerplate"
        }
    ]
$ composer require proklung/bitrix-redis-module

在网站的行政界面 bitrix/admin/partner_modules.php 中安装模块 proklung.redis

将以下代码添加到您的 init.php

use Bitrix\Main\Loader;
use Proklung\Redis\DI\Services;

if (Loader::includeModule('proklung.redis')) {
    Services::boot();
}

配置

配置与父包相同。通过修改文件 bitrix/.settings.phpbitrix/.settings_extra.php 进行设置。

return [
    'proklung.redis' => [
        'value' => [
            'enqueue' => [
                'default' => [
                    'transport' => 'redis://',
                    'client' => [
                        'default_queue' => 'default',
                        'prefix' => 'redis',
                        'app_name' => 'fedy',
                    ],

                ],
            ],
        ],
    ]
];

细节

  • 控制台命令 - 由于模块启动过程中会生成单独的容器,因此建议使用单独的运行器 enqueue 来启动命令。

  • 移除了所有关于Doctrine的内容(以及所有与 jobs 相关的内容,因为它们依赖于Doctrine)。

使用

生产者

use Enqueue\Client\ProducerInterface;

$provider = new Proklung\Redis\DI\Services();
$container = $provider->boot();

/** @var Symfony\Component\DependencyInjection\ContainerInterface $container */

/** @var $producer ProducerInterface $producer */
$producer = $container->get('enqueue.client.default.lazy_producer');

$producer->sendEvent('bitrix-redis', 'REDDIS');

消费者

use Interop\Queue\Message;
use Interop\Queue\Context;
use Interop\Queue\Processor;
use Enqueue\Client\TopicSubscriberInterface;

class FooRedisProcessor implements Processor, TopicSubscriberInterface
{
    public function process(Message $message, Context $session)
    {
        file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/redis-bitrix.log', $message->getBody());

        return self::ACK;
        // return self::REJECT; // when the message is broken
        // return self::REQUEUE; // the message is fine but you want to postpone processing
    }

    public static function getSubscribedTopics()
    {
        return ['bitrix-redis'];
    }
}

FooRedisProcessor 必须在模块的 .settings.php 中注册为服务(并标记为 enqueue.topic_subscriber 标签)

return [
    'parameters' => [
        'value' => [
            'cache_path' => '/bitrix/cache/s1/proklung.redis', // Путь к закешированному контейнеру
            'compile_container_envs' => ['dev', 'prod'], // Окружения при которых компилировать контейнер
            'container.dumper.inline_factories' => false, // Дампить контейнер как одиночные файлы
        ],
        'readonly' => false,
    ],
    'services' => [
        'value' => [
            'Proklung\Redis\Samples\FooRedisProcessor' =>
            [
                'className' => \Proklung\Redis\Samples\FooRedisProcessor::class,
                'tags' => ['name' => 'enqueue.topic_subscriber', 'client' => 'default']
            ],
        ],
        'readonly' => false,
    ],
];

总体而言,模块遵循原始包的模板。主要区别在于服务配置的方式(不是Yaml,而是Bitrix的数组配置)。

容器缓存

cache_path 参数 - 存储编译后容器的路径。如果未设置,则默认为 /bitrix/cache/s1/proklung.redis

预计系统已经以某种方式在 $_ENV 数组中安装了环境变量 DEBUG。如果没有,则默认认为环境是“调试模式”。

compile_container_envs 参数(数组)指定需要缓存容器的环境。

目前简单的逻辑:$_ENV["DEBUG"] === true => 环境为 dev,否则 prod

CLI

一些可用的命令可以简化工作

  • enqueue:consume
  • enqueue:produce
  • enqueue:setup-broker
  • enqueue:routes
  • enqueue:transport:consume

在原始包的文档中了解更多关于 CLI命令

模块的 /install/bin 文件夹中有一个名为 enqueue 的文件。在安装模块时,系统会尝试将其复制到比 DOCUMENT_ROOT 高两层级的 bin 目录。如果不存在这样的目录,则不会进行任何操作。需要手动创建文件夹并手动复制文件。

启动

   php bin/enqueue enqueue:setup-broker

所有可用的命令

   php bin/enqueue

其他传输方式

RabbitMq

配置

Bitrix的 .settings.php

// ... предыдущее

    'proklung.redis' => [
        'value' => [
            'enqueue' => [
                // ... предыдущее
                'rabbit' => [
                    'transport' => 'amqp://',
                    'client' => [
                        'default_queue' => 'default',
                        'prefix' => 'rabbit',
                        'app_name' => 'fedy',
                    ],
                ],
            ]
        ]
    ],

与Redis或文件系统类似。重要的是第一次不要忘记运行 setup-broker(将创建 enqueue 表)。

php bin/enqueue enqueue:setup-broker --client=rabbit

接收消息

php bin/enqueue enqueue:consume --client=rabbit

其中 rabbit 是在Bitrix的 .settings.php 中定义的客户端名称。

DBAL

安装

为了不使模块过载依赖项 - enqueue/dbal 不包含在标准的 composer.json 中。要使用此传输方式,需要在最终项目中手动运行 composer require enqueue/dbal

配置

Bitrix的 .settings.php

// ... предыдущее

    'proklung.redis' => [
        'value' => [
            'enqueue' => [
                // ... предыдущее
                'dbal' => [
                    'transport' => 'mysql://root:@localhost/bitrix.loc',
                    'client' => [
                        'default_queue' => 'default',
                        'prefix' => 'dbal',
                        'app_name' => 'fedy',
                    ],
                ],
            ]
        ]
    ],

与Redis或文件系统类似。重要的是第一次不要忘记运行 setup-broker(将创建 enqueue 表)。

php bin/enqueue enqueue:setup-broker --client=dbal

接收消息

php bin/enqueue enqueue:consume --client=dbal

其中 dbal 是在Bitrix的 .settings.php 中定义的客户端名称。

文件系统

配置

Bitrix的 .settings.php

// ... предыдущее

    'proklung.redis' => [
        'value' => [
            'enqueue' => [
                // ... предыдущее
                'filesystem' => [
                    // $_SERVER['DOCUMENT_ROOT'] - важно!
                    'transport' => 'file:///' . $_SERVER['DOCUMENT_ROOT'] . '/bitrix/cache/s1/fs',
                    'client' => [
                        'default_queue' => 'default',
                        'prefix' => 'fs',
                        'app_name' => 'fedy',
                    ],
                ],
            ]
        ]
    ],

客户端

use Interop\Queue\Message;
use Interop\Queue\Context;
use Interop\Queue\Processor;
use Enqueue\Client\TopicSubscriberInterface;

class FooFsProcessor implements Processor, TopicSubscriberInterface
{
    public function process(Message $message, Context $session)
    {
        file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/fs-bitrix.log', $message->getBody());

        return self::ACK;
    }

    public static function getSubscribedTopics()
    {
        return ['bitrix-fs'];
    }
}

模块的 .settings.php

return [
    'services' => [
        'value' => [
            // ... предыдущие клиенты
            'Proklung\Redis\Samples\FooFsProcessor' => [
                    'className' => \Proklung\Redis\Samples\FooFsProcessor::class,
                    'tags' => ['name' => 'enqueue.topic_subscriber', 'client' => 'filesystem']
            ],
        ],
        'readonly' => false,
    ],
];

发送消息

$services = new Proklung\Redis\DI\Services();
$container = $services->boot();

$producerFs = $container->get('enqueue.client.filesystem.lazy_producer');
$producerFs->sendEvent('bitrix-fs', 'FS');

接收消息

php bin/enqueue enqueue:consume --client=filesystem

其中 filesystem 是在Bitrix的 .settings.php 中定义的客户端名称。

或者这样

/** @var Context $context */
$context = $container->get('enqueue.transport.filesystem.context');

$fooQueue = $context->createQueue('fs.fedy.default'); // См. .settings.php, свойства клиента.
$consumer = $context->createConsumer($fooQueue);
$message = $consumer->receiveNoWait(); // Для примера, чтобы скрипт не зацикливался. В нормальной среде - $consumer->receive().

$consumer->acknowledge($message);

致谢

本模块是对的适配,以便在Bitrix环境中运行。

原始的文档是有效的,除了某些细节。