Как добавить выполнение моего снипета в очередь чтобы не мешать основной работе?
Есть скрипт что отправляет уведомление в ватсап, оно занимает время, хочу поставить его в очередь но не могу понять как, подскажите пожалуйста как это сделать?
Комментарии: 6
Пытался так
Плагин на событие «OnWebPageComplete »
modx_register_queues и modx_register_topics
1)modx_register_queues
поле «name» такое «wpnotifier»
поле «options» такое «a:1:{s:9:»directory";s:10:«wpnotifier»;}"
2)modx_register_topics
поле «name» такое "/distrib/instances/"
Как я понялчто где-то должно создаться запись где "/distrib/instances/" будет равнятся айпи сервера "/distrib/instances/127.0.0.1" допустим, но не появляется
Плагин на событие «OnWebPageComplete »
<?php
/* найти любые удаленные команды для выполнения из главного экземпляра */
$instance = $_SERVER['SERVER_ADDR'];
if (!empty($instance) && $modx->getService('registry', 'registry.modRegistry')) {
$modx->registry->addRegister('wpnotifier', 'registry.modDbRegister', array('directory' => 'wpnotifier'));
$modx->registry->wpnotifier->connect();
/* зарегистрировать этот экземпляр */
$modx->registry->wpnotifier->subscribe("/distrib/instances/");
$modx->registry->wpnotifier->send("/distrib/instances/", array($instance => true), array('expires' => time() + 1440));
/* найдите любые действительные командные сообщения для этого экземпляра и действуйте на них */
$modx->registry->wpnotifier->subscribe("/distrib/commands/{$instance}/");
$commands = $modx->registry->wpnotifier->read(array('poll_limit' => 1, 'msg_limit' => 1));
if (!empty($commands)) {
$command = reset($commands);
if (!empty($command)) {
switch ($command) {
case 'notify_simple_2_field_form':
$modx->log(1, 'Сообщение');
$results = $modx->runSnippet('whatsappNotifier', array(
'fullName' => 'TEST',
'phoneNumber' => '+987987987987987',
'pageName' => 'Главная',
'pageUrl' => 'example.com/'
)
);
break;
default:
break;
}
}
}
}
А так же регистрирую через хук в формите этот сниппет<?php
/* читать экземпляры и записывать сообщения для очистки кэша в каждый каталог команд */
if ($modx->getService('registry', 'registry.modRegistry')) {
$modx->registry->addRegister('wpnotifier', 'registry.modDbRegister', array('directory' => 'wpnotifier'));
$modx->registry->wpnotifier->connect();
$modx->registry->wpnotifier->subscribe('/distrib/instances/');
$instances = $modx->registry->wpnotifier->read(array('poll_limit' => 1, 'msg_limit' => 25, 'remove_read' => false));
if (!empty($instances)) {
foreach ($instances as $instance) {
if ($instance == $_SERVER['SERVER_ADDR']) continue;
$modx->registry->wpnotifier->subscribe("/distrib/commands/{$instance}/");
$modx->registry->wpnotifier->send("/distrib/commands/{$instance}/", 'notify_simple_2_field_form', array('expires' => time() + 1440));
}
}
}
В баззе данных в 2х таблицах появляются записиmodx_register_queues и modx_register_topics
1)modx_register_queues
поле «name» такое «wpnotifier»
поле «options» такое «a:1:{s:9:»directory";s:10:«wpnotifier»;}"
2)modx_register_topics
поле «name» такое "/distrib/instances/"
Как я понялчто где-то должно создаться запись где "/distrib/instances/" будет равнятся айпи сервера "/distrib/instances/127.0.0.1" допустим, но не появляется
Убрал фигурные скобки возле переменной
$instance
и всё равно. Так же убрал проверку на server__addr в хуке регистрации, всё так же не работает.<?php
/* читать экземпляры и записывать сообщения для очистки кэша в каждый каталог команд */
if ($modx->getService('registry', 'registry.modRegistry')) {
$modx->registry->addRegister('wpnotifier', 'registry.modDbRegister', array('directory' => 'wpnotifier'));
$modx->registry->wpnotifier->connect();
$modx->registry->wpnotifier->subscribe('/distrib/instances/');
$instances = $modx->registry->wpnotifier->read(array('poll_limit' => 1, 'msg_limit' => 25, 'remove_read' => false));
if (!empty($instances)) {
foreach ($instances as $instance) {
$modx->log(1, 'после нет');
$modx->registry->wpnotifier->subscribe("/distrib/commands/$instance/");
$modx->registry->wpnotifier->send("/distrib/commands/$instance/", 'notify_simple_2_field_form', array('expires' => time() + 1440));
}
}
}
Как-то у тебя всё сложно.
Вот так добавить в очередь
Вот так добавить в очередь
$registry = $modx->getService('registry', 'registry.modRegistry');
$QM = $registry->getRegister('sendToPlatforms', 'registry.modDbRegister');
$branch = '/default/';
$QM->subscribe($branch);
$QM->send($branch, $data); // $data может быть стройкой или массивом.
А вот так прочитать$registry = $modx->getService('registry', 'registry.modRegistry');
$QM = $registry->getRegister('sendToPlatforms', 'registry.modDbRegister');
$branch = '/default/';
$QM->subscribe($this->branch);
$items = $QM->read([
'poll_limit' => 1,
'msg_limit' => 1000,
'include_keys' => true,
'remove_read' => true
]);
А ещё про очереди в modx хорош написано тут.
Спасибо огромное, и за статью, получилось, и потом получилось ещё и в крон поставить, вообще спасибо большое, прям открыл для себя 2а новых инструмента, сразу столько идей)
А еще у нас есть компонент для планирования отложенных задач scheduler
Спасибо, будет ещё гораздо проще, но не зря всё таки пошёл по сложному пути, узнал много нового
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.