proklung / bitrix.redis.module
支持在Bitrix中使用Redis队列(以及更多)
Requires
- php: >=7.1 || ^8.0
- ext-json: *
- composer/installers: ~1
- enqueue/amqp-bunny: ^0.10.9
- enqueue/enqueue: ^0.10
- enqueue/fs: ^0.10.9
- enqueue/null: ^0.10
- enqueue/redis: ^0.10.9
- predis/predis: ^1.1
- proklung/bitrix-containerable-boilerplate: ^1.1
- proklung/bitrix.module.boilerplate: ^1.0
- queue-interop/amqp-interop: ^0.8.2
- queue-interop/queue-interop: ^0.8
- symfony/http-foundation: ^4.4 || ^5.0
- symfony/http-kernel: ^4.4 || ^5.0
- symfony/yaml: ^4.4 || ^5.0
Requires (Dev)
- icanhazstring/composer-unused: ^0.7.7
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.php
和 bitrix/.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环境中运行。
原始的文档是有效的,除了某些细节。