Как добавить выполнение моего снипета в очередь чтобы не мешать основной работе?

Есть скрипт что отправляет уведомление в ватсап, оно занимает время, хочу поставить его в очередь но не могу понять как, подскажите пожалуйста как это сделать?
Vladimir
10 февраля 2023, 18:20
modx.pro
2
772
0

Комментарии: 6

Vladimir
10 февраля 2023, 19:54
0
Пытался так
Плагин на событие «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" допустим, но не появляется
    Vladimir
    10 февраля 2023, 20:05
    0
    Убрал фигурные скобки возле переменной
    $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));
            }
        }
    }
      Артур Шевченко
      10 февраля 2023, 20:18
      1
      +2
      Как-то у тебя всё сложно.
      Вот так добавить в очередь
      $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 хорош написано тут.
        Vladimir
        11 февраля 2023, 18:33
        +1
        Спасибо огромное, и за статью, получилось, и потом получилось ещё и в крон поставить, вообще спасибо большое, прям открыл для себя 2а новых инструмента, сразу столько идей)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6