Skip to content

Commit 0751565

Browse files
committed
First commit
0 parents  commit 0751565

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+3918
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.idea
2+
/vendor/
3+
vendor/
4+
composer.lock

.settings.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
/**
3+
* @author RG. <[email protected]>
4+
*/
5+
6+
return [
7+
'parameters' => [
8+
'value' => [
9+
'rabbitmq.connection.class' => 'PhpAmqpLib\Connection\AMQPConnection',
10+
'rabbitmq.socket_connection.class' => 'PhpAmqpLib\Connection\AMQPSocketConnection',
11+
'rabbitmq.lazy.class' => 'PhpAmqpLib\Connection\AMQPLazyConnection',
12+
'rabbitmq.lazy.socket_connection.class' => 'PhpAmqpLib\Connection\AMQPLazySocketConnection',
13+
'rabbitmq.connection_factory.class' => 'Proklung\RabbitMq\RabbitMq\AMQPConnectionFactory',
14+
'rabbitmq.binding.class' => 'Proklung\RabbitMq\RabbitMq\Binding',
15+
'rabbitmq.producer.class' => 'Proklung\RabbitMq\RabbitMq\Producer',
16+
'rabbitmq.consumer.class' => 'Proklung\RabbitMq\RabbitMq\Consumer',
17+
'rabbitmq.multi_consumer.class' => '',
18+
'rabbitmq.dynamic_consumer.class' => '',
19+
'rabbitmq.batch_consumer.class' => '',
20+
'rabbitmq.anon_consumer.class' => '',
21+
'rabbitmq.rpc_client.class' => '',
22+
'rabbitmq.rpc_server.class' => '',
23+
'rabbitmq.logged.channel.class' => '',
24+
'rabbitmq.parts_holder.class' => 'Proklung\RabbitMq\RabbitMq\AmqpPartsHolder',
25+
'rabbitmq.fallback.class' => 'Proklung\RabbitMq\RabbitMq\Fallback',
26+
],
27+
'readonly' => false,
28+
],
29+
'services' => [
30+
'value' => [
31+
'rabbitmq.service_loader' => [
32+
'className' => 'Proklung\RabbitMq\Integration\DI\Services',
33+
],
34+
],
35+
'readonly' => false,
36+
],
37+
];

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2020 Roman Horbach
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# Форк [пакета](https://github.com/yngc0der/bitrix-rabbitmq)
2+
3+
## Зачем?
4+
5+
Оригинальный модуль заточен под битриксовый сервис-локатор, а он встречается только на версиях главного модуля больше,
6+
чем `20.5.400`. На моих проектах такой свежести нет, а функционал интересный.
7+
8+
## Отличия
9+
10+
Выпилил (частично, пока не касается команд) битриксовый сервис-локатор в пользу отдельного симфонического контейнера.
11+
12+
# Оригинальное readme.MD с некоторыми корректировками
13+
14+
# yngc0der.rabbitmq
15+
16+
## О проекте
17+
18+
Модуль включает в себя обмен сообщениями в вашем php-приложении через [RabbitMQ](http://www.rabbitmq.com/)
19+
с использованием библиотеки [php-amqplib](http://github.com/php-amqplib/php-amqplib).
20+
21+
Пакет реализует шаблоны обмена сообщениями, приведенными в библиотеке [Thumper](https://github.com/php-amqplib/Thumper),
22+
что позволяет сделать публикацию сообщений в RabbitMQ из вашего контроллера очень простой:
23+
24+
```php
25+
use Proklung\RabbitMq\Integration\DI\Services;
26+
27+
$msg = ['user_id' => 1235, 'image_path' => '/path/to/new/pic.png'];
28+
Services::getInstance()->get('rabbitmq.upload_picture_producer')->publish(serialize($msg));
29+
```
30+
31+
Для получения 50-ти сообщений из очереди `upload_pictures`, вы просто запускаете слушатель:
32+
33+
```php
34+
use Proklung\RabbitMq\Integration\DI\Services;
35+
36+
$consumer = Services::getInstance()->get('rabbitmq.upload_picture_consumer');
37+
$consumer->consume(50);
38+
```
39+
40+
Данные примеры требуют запущенного сервера RabbitMQ.
41+
42+
## Минимальные требования
43+
* `php-7.1.3` или выше
44+
45+
## Установка
46+
Загрузите пакет, используя пакетный менеджер composer, либо вручную:
47+
48+
```bash
49+
$ composer require proklung/bitrix-rabbitmq-module
50+
```
51+
52+
Установите модуль "proklung.rabbitmq" в административном интерфейсе сайта `bitrix/admin/partner_modules.php`
53+
54+
Добавьте следующий код в ваш `init.php`:
55+
56+
```php
57+
use Bitrix\Main\Loader;
58+
use Proklung\RabbitMq\Integration\DI\Services;
59+
60+
if (Loader::includeModule('proklung.rabbitmq')) {
61+
Services::boot();
62+
}
63+
```
64+
65+
## Использование
66+
Конфигурация идентична родительскому пакету. Настройка производится посредством правки файлов `bitrix/.settings.php`
67+
и `bitrix/.settings_extra.php`:
68+
69+
```php
70+
return [
71+
'rabbitmq' => [
72+
'value' => [
73+
'connections' => [
74+
'default' => [
75+
'host' => '172.17.0.2',
76+
'port' => 5672,
77+
'user' => 'guest',
78+
'password' => 'guest',
79+
'vhost' => '/',
80+
'lazy' => false,
81+
'connection_timeout' => 3.0,
82+
'read_write_timeout' => 3.0,
83+
'keepalive' => false,
84+
'heartbeat' => 0,
85+
'use_socket' => true,
86+
],
87+
],
88+
'producers' => [
89+
'upload_picture' => [
90+
'connection' => 'default',
91+
'exchange_options' => [
92+
'name' => 'upload_picture',
93+
'type' => 'direct',
94+
],
95+
],
96+
],
97+
'consumers' => [
98+
'upload_picture' => [
99+
'connection' => 'default',
100+
'exchange_options' => [
101+
'name' => 'upload_picture',
102+
'type' => 'direct',
103+
],
104+
'queue_options' => [
105+
'name' => 'upload_picture',
106+
],
107+
'callback' => 'UploadPictureConsumer',
108+
],
109+
],
110+
],
111+
'readonly' => false,
112+
],
113+
];
114+
```
115+
116+
Пример обработчика сообщений:
117+
118+
```php
119+
// UploadPictureConsumer.php
120+
121+
use Proklung\RabbitMq\RabbitMq\ConsumerInterface;
122+
use PhpAmqpLib\Message\AMQPMessage;
123+
124+
class UploadPictureConsumer implements ConsumerInterface
125+
{
126+
public function execute(AMQPMessage $msg)
127+
{
128+
echo ' [x] Received ', $msg->body, "\n";
129+
}
130+
}
131+
```
132+
133+
## Интеграция с CLI
134+
Если у вас установлен модуль [yngc0der.cli](https://github.com/yngc0der/bitrix-cli), вам будут доступны некоторые
135+
команды, которые упрощают работу:
136+
137+
* `rabbitmq:consumer` Executes a consumer
138+
* `rabbitmq:delete` Delete a consumer's queue
139+
* `rabbitmq:purge` Purge a consumer's queue
140+
* `rabbitmq:setup-fabric` Sets up the Rabbit MQ fabric
141+
* `rabbitmq:stdin-producer` Executes a producer that reads data from STDIN
142+
143+
## Адаптировано к Bitrix
144+
- [x] Connection (Stream, Socket, Lazy, LazySocket)
145+
- [x] Connection factory
146+
- [x] Binding
147+
- [x] Producer
148+
- [x] Consumer
149+
- [x] Parts holder
150+
- [x] Fallback producer
151+
- [ ] Multi-consumer
152+
- [ ] Dynamic consumer
153+
- [ ] Batch consumer
154+
- [ ] Anon consumer
155+
- [ ] Rpc client
156+
- [ ] Rpc server
157+
- [ ] Logged channel
158+
159+
## Credits
160+
Модуль и документация базируется на [RabbitMqBundle](https://github.com/php-amqplib/RabbitMqBundle).
161+
Там же вы можете найти подробную информацию о его использовании.

composer.json

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"name": "proklung/bitrix.rabbitmq.module",
3+
"description": "Поддержка RabbitMQ в Битриксе",
4+
"type": "bitrix-d7-module",
5+
"keywords": [
6+
"bitrix",
7+
"bitrix-module",
8+
"bitrix-cms",
9+
"bitrix-d7"
10+
],
11+
"homepage": "https://github.com/ProklUng/bitrix.rabbitmq.module",
12+
"license": "MIT",
13+
"authors": [
14+
{
15+
"name": "Gavrilov Fedy",
16+
"email": "[email protected]"
17+
}
18+
],
19+
20+
"support": {
21+
"issues": "https://github.com/ProklUng/bitrix.rabbitmq.module/issues",
22+
"source": "https://github.com/ProklUng/bitrix.rabbitmq.module"
23+
},
24+
"extra": {
25+
"installer-name": "prokl.rabbitmq"
26+
},
27+
"require": {
28+
"php": ">=7.1 || ^8.0",
29+
"symfony/dependency-injection": "^4.0 || ^5.0",
30+
"composer/installers": "~1",
31+
"php-amqplib/php-amqplib": "^2.12.1 || ^3",
32+
"psr/log": "^1.1.3"
33+
},
34+
"require-dev": {
35+
"icanhazstring/composer-unused": "^0.7.5"
36+
}
37+
}

install/index.php

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
<?php
2+
/**
3+
* @author RG. <[email protected]>
4+
*/
5+
6+
use Bitrix\Main\Application;
7+
use Bitrix\Main\ModuleManager;
8+
use Bitrix\Main\Loader;
9+
use Bitrix\Main\Context;
10+
use Bitrix\Main\Localization\Loc;
11+
use Bitrix\Main\EventManager;
12+
13+
Loc::loadMessages(__FILE__);
14+
15+
/**
16+
* Class proklung_rabbitmq
17+
*/
18+
class proklung_rabbitmq extends CModule
19+
{
20+
public function __construct()
21+
{
22+
$arModuleVersion = [];
23+
include __DIR__ . '/version.php';
24+
25+
$this->MODULE_ID = 'prokl.rabbitmq';
26+
$this->MODULE_VERSION = $arModuleVersion['VERSION'];
27+
$this->MODULE_VERSION_DATE = $arModuleVersion['VERSION_DATE'];
28+
$this->MODULE_NAME = Loc::getMessage('YC_RMQ_MODULE_NAME');
29+
$this->MODULE_DESCRIPTION = Loc::getMessage('YC_RMQ_MODULE_DESC');
30+
$this->PARTNER_NAME = Loc::getMessage('YC_PARTNER_NAME');
31+
$this->PARTNER_URI = Loc::getMessage('YC_PARTNER_URI');
32+
}
33+
34+
/**
35+
* @inheritDoc
36+
*/
37+
public function DoInstall()
38+
{
39+
parent::DoInstall();
40+
41+
/** @global CMain $APPLICATION */
42+
global $APPLICATION;
43+
44+
if ($this->checkRequirements()) {
45+
ModuleManager::registerModule($this->MODULE_ID);
46+
Loader::includeModule($this->MODULE_ID);
47+
48+
$this->InstallDB();
49+
$this->InstallEvents();
50+
$this->InstallFiles();
51+
$this->InstallTasks();
52+
} else {
53+
$APPLICATION->ThrowException(Loc::getMessage('YC_INSTALL_ERROR_REQUIREMENTS'));
54+
}
55+
56+
$APPLICATION->IncludeAdminFile(
57+
Loc::getMessage('YC_INSTALL_TITLE'),
58+
$this->getPath() . '/install/step.php'
59+
);
60+
}
61+
62+
/**
63+
* @inheritDoc
64+
*/
65+
public function DoUninstall()
66+
{
67+
parent::DoUninstall();
68+
69+
/** @global CMain $APPLICATION */
70+
global $APPLICATION;
71+
72+
$request = Context::getCurrent()->getRequest();
73+
74+
if (is_null($request->get('step')) || (int)$request->get('step') === 1) {
75+
$APPLICATION->IncludeAdminFile(
76+
Loc::getMessage('YC_UNINSTALL_TITLE'),
77+
$this->getPath() . '/install/unstep.php'
78+
);
79+
}
80+
81+
if ((int)$request->get('step') === 2) {
82+
Loader::includeModule($this->MODULE_ID);
83+
84+
if (is_null($request->get('savedata')) || $request->get('savedata') !== 'Y') {
85+
$this->UnInstallDB();
86+
}
87+
88+
$this->UnInstallEvents();
89+
$this->UnInstallFiles();
90+
$this->UnInstallTasks();
91+
92+
Loader::clearModuleCache($this->MODULE_ID);
93+
ModuleManager::unRegisterModule($this->MODULE_ID);
94+
}
95+
}
96+
97+
/**
98+
* @inheritDoc
99+
*/
100+
public function InstallEvents()
101+
{
102+
parent::InstallEvents();
103+
104+
EventManager::getInstance()->registerEventHandler(
105+
'yngc0der.cli',
106+
'OnCommandsLoad',
107+
$this->MODULE_ID,
108+
'\\Proklung\\RabbitMq\\Integration\\CLI\\Commands',
109+
'onCommandsLoad'
110+
);
111+
}
112+
113+
/**
114+
* @return boolean
115+
*/
116+
public function checkRequirements(): bool
117+
{
118+
return true;
119+
}
120+
121+
/**
122+
* @param boolean $includeDocumentRoot
123+
*
124+
* @return string
125+
*/
126+
public function getPath(bool $includeDocumentRoot = true): string
127+
{
128+
return $includeDocumentRoot
129+
? dirname(__DIR__)
130+
: (string)str_ireplace(Application::getDocumentRoot(),'', dirname(__DIR__));
131+
}
132+
}

0 commit comments

Comments
 (0)