Иконка ресурса

CLI Job Runner for XF 2.2 2.1.1

Нет прав для скачивания
Совместимость с XenForo
  1. 2.2
  2. 2.3
Этот плагин для XenForo 2.2 реализует расширенный, запускаемый через CLI, обработчик заданий для использования с Unix cron в качестве замены встроенной команды xf:run-jobs, представленной в XF 2.2.

Команда названа hg:run-jobs и делает вещи, схожие с xf:run-jobs, но с большей функциональностью и настройками.

Функции
Основные функции плагина:
  • Позволяет командам выполнять работы/задачи cron до 10 минут, даже при запуске каждую минуту из задачи cron (использует файл блокировки для предотвращения одновременного выполнения нескольких операций) — идеально подходит для повышения производительности заданий на сайтах с высоким трафиком
  • Обширные данные отладки, доступные для тестирования и выявления проблем с работами и задачами cron
  • Замена xf:run-jobs
Требования
Этот плагин требует PHP 7.0 или выше и был протестирован на XenForo 2.2.0 beta 1.

Установка
Установите плагин так же, как и любой другой.

После установки перейдите в Настройки → Система и производительность и установите настройку Job run trigger в Server based trigger
1596700351453.png


Для начала, вам следует проверить, что Job Runner функционирует. Выполните в консоли команду ниже:
Bash:
$ php <path to your forum root>/cmd.php hg:run-jobs
Например, если корневая директория вашего форума — /srv/www/xenforo/community, команда будет выглядеть так:
Bash:
$ php /srv/www/xenforo/community/cmd.php hg:run-jobs

Выполнение этой команды приведет к выполнению всех невыполненных заданий, а затем завершится сообщением о том, есть ли еще задания, ожидающие выполнения, или нет. При выполнении этой команды из cron рекомендуется использовать флаг --quiet (или -q) для отключения вывода.

Когда вы убедитесь, что средство выполнения заданий работает правильно, вам нужно будет создать свою собственную задачу cron, чтобы запускать ее по расписанию по вашему выбору.

Примечание: если у вас уже настроена задача cron для запуска xf:run-jobs, просто отключите ее и замените идентичной задачей, которая вместо этого запускает hg:run-jobs.

Метод #1: Использование crontab.
Рекомендуется запускать это задание cron от имени пользователя веб-сервера для предотвращения возможных проблем с правами.

Например, для Ubuntu с пользователем веб-сервера www-data, установите задачу cron с помощью этой команды:
Bash:
$ sudo crontab -u www-data -e
Отредактируйте файл crontab, добавив в него:
Bash:
    *       *       *       *       *       php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs
Сохраните файл crontab.

Метод #2: Использование cron.d.
Вместо использования crontab некоторые дистрибутивы Linux создают каталог, который автоматически проверяется на выполнение задач cron. В случае Ubuntu, вы можете создавать файлы в /etc/cron.d/, где можно указать расписание, пользователя, который будет выполнять команду, и саму команду.

Создайте файл в /etc/cron.d/ со следующим содержанием:
Bash:
* * * * * webserver-user php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs
...где webserver-user заменено на имя пользователя вашего веб-сервера и изменено имя директории.

Опять же, используя предыдущий пример, где пользователь веб-сервера — www-data, а корень форума — /srv/www/xenforo/community, можно выполнить следующую команду для создания файла cron:
Bash:
echo "* * * * * www-data php /srv/www/xenforo/community/cmd.php --quiet hg:run-jobs" | sudo tee -a /etc/cron.d/xenforo



Crontab и cron.d будут запускать обработчик заданий каждую минуту, проверяя наличие невыполненных заданий, которые нужно запустить.

По умолчанию job runner будет работать не более 30 секунд, выполняя все невыполненные задания, пока в очереди не останется выполняемых заданий.

Обновление плагина с v1.x после обновления XenForo до v2.2
v2.0 изменяет имя команды и максимально допустимое время выполнения. Также обратите внимание, что параметр --time в v1.x был переименован в --max-execution-time в соответствии с основным исполнителем заданий, предоставленным в XF v2.2.

Для обновления:
  1. Обновитесь до XenForo версии v2.2 RC2 или новее
  2. Уставивите плагин версии v2.0.x
  3. Измените задание cron на hg:run-jobs вместо xf:run-jobs
  4. Если вы использовали параметр --time option, переименуйте его в --max-execution-time
  5. Необязательно: настройте параметр --max-execution-time на любое значение до 600 секунд (10 минут), чтобы обработка задания занимала столько времени, сколько нужно. Например: --max-execution-time = 180 позволит исполнителю задания выполняться до 3 минут за раз.
Убедитесь, что вы выбрали опцию «Server based trigger» в Настройки → Система и производительность в настройке Job run trigger

Настройка
Вы можете настроить максимальное время выполнения задания, указав параметр --time=[ВРЕМЯ] в консоли.

Например, увеличим время выполнения job runner`а до 45 секунд:
Bash:
$ php <path to your forum root>/cmd.php --time=45 hg:run-jobs

Этот плагнин использует файлы блокировки для предотвращения одновременного выполнения нескольких команд исполнителей заданий, что также позволяет запускать команду в течение более длительных периодов времени на загруженных сайтах.

Максимально допустимое время выполнения составляет 10 минут (600 секунд). Команда будет выполняться до тех пор, пока не будет найдено невыполненных заданий, а затем остановится, поэтому время выполнения обычно составляет всего несколько секунд.

Для дальнейшей настройки выполнения вашего задания вы также можете настроить максимальное время, в течение которого каждое задание может выполняться.
Это настраивается с помощью параметра XenForo config.php:
PHP:
$config['jobMaxRunTime'] = 8;
Параметр jobMaxRunTime настраивает количество времени в секундах, в течение которого будет разрешена обработка заданий, прежде чем они будут приостановлены для дальнейшей обработки на другом обходе, если это возможно. Параметр по умолчанию оптимизирован для запуска задания из браузера, поэтому, чтобы задания могли выполняться дольше в среде CLI, вы можете изменить это значение на более высокое значение.

В общем, рекомендуется, чтобы этот параметр оставался относительно небольшим, чтобы избежать ситуации, когда одно очень большое задание может помешать своевременному выполнению других заданий. Может потребоваться поэкспериментировать, чтобы найти оптимальное значение для загрузки вашего сервера и размера форума. В случае сомнений оставьте значение по умолчанию — 8 секунд.

Использование
Команда run-jobs должна выполняться автоматически через задание cron task, как в инструкциях выше.

Отображение заданий

Команда hg:show-jobs список текущих заданий, ожидающих выполнения, чтобы вы могли увидеть, насколько заполнена очередь заданий.

По умолчанию будут показаны только следующие 100 запланированных заданий, вы можете использовать параметр --all, чтобы показать полный список всех ожидающих заданий.

В списке всегда должно быть хотя бы одно задание (основное задание Cron). Для XF 2.1 и выше вы также увидите задание проверки обновления.
Bash:
$ php cmd.php xf:show-jobs              

2 pending jobs found

+----------------+-----------------+----------------------+----------------------+
| Key            | Class           | Next Run             | Last Run             |
+----------------+-----------------+----------------------+----------------------+
| cron           | XF\Job\Cron     | 11-Apr-2019 10:52:01 | 11-Apr-2019 10:52:31 |
| xfUpgradeCheck | XF:UpgradeCheck | 12-Apr-2019 00:12:21 | 10-Apr-2019 21:24:03 |
+----------------+-----------------+----------------------+----------------------+

The current time is: 11-Apr-2019 10:52:31 (UTC+10:00)

Отладка заданий
Существуют обширные инструменты отладки, помогающие выявлять проблемы с задачами Jobs и Cron.

Для запуска режима отладки, сначала отключите Unix cron, который запускает выполнение заданий автоматически (не забудьте включить его снова, как только закончите отладку!), а затем используйте параметры для получения подробностей (подробности: -v, расширенные подробности: -vv или отладка: -vvv) для команды hg:run-jobs, чтобы установить уровень подробностей для вывода.

Вывод в консоль имеет формат, аналогичный тому, который используется библиотекой Monolog (хотя Monolog не используется для генерации вывода).

Например, параметр -v:
Bash:
$ php cmd.php hg:run-jobs -v
[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\CleanUp::runUserDowngrade executed in 0.01 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry Hampel\LogDigest\Cron\SendLogs::serverError executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\MemberStats::rebuildMemberStatsCache executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry Hampel\Slack\Cron\NotifyLogs::notify executed in 0.03 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\Feeder::importFeeds executed in 0.01 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XFMG\Cron\RandomCache::generateRandomMediaCache executed in 0.07 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\EmailBounce::process executed in 0.00 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Cron entry XF\Cron\Counters::rebuildForumStatistics executed in 0.02 seconds

[2019-11-27 23:53:09] XF\Job\Cron: Job executed in 0.20 seconds

No more runnable jobs pending
Параметр расширенных подробностей -vv добавляет контекст, обычно о JobResult:
Bash:
$ php cmd.php hg:run-jobs -vv
[2019-11-27 23:49:49] XF\Job\Cron: Cron entry Hampel\Slack\Cron\NotifyLogs::notify executed in 0.01 seconds {"entry_id":"slackNotifyServerErrors","cron_class":"Hampel\\Slack\\Cron\\NotifyLogs","cron_method":"notify","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":-1}},"active":true,"next_run":1574898543,"addon_id":"Hampel\/Slack"}

[2019-11-27 23:49:49] XF\Job\Cron: Cron entry Hampel\SparkPost\Cron\MessageEvents::fetchMessageEvents executed in 0.00 seconds {"entry_id":"sparkpostMessageEvents","cron_class":"Hampel\\SparkPost\\Cron\\MessageEvents","cron_method":"fetchMessageEvents","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":19,"1":49}},"active":true,"next_run":1574898543,"addon_id":"Hampel\/SparkPost"}

[2019-11-27 23:49:49] XF\Job\Cron: Job executed in 0.03 seconds {"completed":false,"jobId":2,"continueDate":1574898603,"continueDate_formatted":"2019-11-27 23:50:03 UTC","statusMessage":"Running... Cron entries"}

[2019-11-27 23:49:49] Hampel\SparkPost:MessageEvent: Job executed in 0.83 seconds {"completed":true,"jobId":12,"continueDate":null,"continueDate_formatted":"","statusMessage":""}

No more runnable jobs pending
И, наконец, параметр отладки -vvv добавляет расширенную информацию о задании:
Bash:
$ php cmd.php hg:run-jobs -vvv
[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Feeder::importFeeds executed in 0.01 seconds {"entry_id":"feeder","cron_class":"XF\\Cron\\Feeder","cron_method":"importFeeds","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":2,"1":12,"2":22,"3":32,"4":42,"5":52}},"active":true,"next_run":1574879524,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Counters::rebuildForumStatistics executed in 0.02 seconds {"entry_id":"forumStatistics","cron_class":"XF\\Cron\\Counters","cron_method":"rebuildForumStatistics","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":3,"1":13,"2":23,"3":33,"4":43,"5":53}},"active":true,"next_run":1574879584,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\MemberStats::rebuildMemberStatsCache executed in 0.03 seconds {"entry_id":"memberStatsCache","cron_class":"XF\\Cron\\MemberStats","cron_method":"rebuildMemberStatsCache","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":0,"1":10,"2":20,"3":30,"4":40,"5":50}},"active":true,"next_run":1574880004,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Trophy::runTrophyCheck executed in 0.00 seconds {"entry_id":"trophy","cron_class":"XF\\Cron\\Trophy","cron_method":"runTrophyCheck","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":40}},"active":true,"next_run":1574880004,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XFMG\Cron\Statistics::cacheGalleryStatistics executed in 0.01 seconds {"entry_id":"xfmgCacheStats","cron_class":"XFMG\\Cron\\Statistics","cron_method":"cacheGalleryStatistics","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":10,"1":40}},"active":true,"next_run":1574880004,"addon_id":"XFMG"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\CleanUp::expireTempUserChanges executed in 0.00 seconds {"entry_id":"expireTempUserChanges","cron_class":"XF\\Cron\\CleanUp","cron_method":"expireTempUserChanges","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":42}},"active":true,"next_run":1574880124,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XFMG\Cron\RandomCache::generateRandomAlbumCache executed in 0.02 seconds {"entry_id":"xfmgGenerateRandomAlbum","cron_class":"XFMG\\Cron\\RandomCache","cron_method":"generateRandomAlbumCache","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":12,"1":42}},"active":true,"next_run":1574880124,"addon_id":"XFMG"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\EmailUnsubscribe::process executed in 0.00 seconds {"entry_id":"emailUnsubscribe","cron_class":"XF\\Cron\\EmailUnsubscribe","cron_method":"process","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":13,"1":43}},"active":true,"next_run":1574880184,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Cron entry XF\Cron\Ban::deleteExpiredBans executed in 0.01 seconds {"entry_id":"deleteExpiredBans","cron_class":"XF\\Cron\\Ban","cron_method":"deleteExpiredBans","run_rules":{"day_type":"dom","dom":{"0":-1},"hours":{"0":-1},"minutes":{"0":45}},"active":true,"next_run":1574880304,"addon_id":"XF"} {}

[2019-11-27 23:48:03] XF\Job\Cron: Job executed in 0.32 seconds {"completed":false,"jobId":2,"continueDate":1574898543,"continueDate_formatted":"2019-11-27 23:49:03 UTC","statusMessage":"Running... Cron entries"} {"job_id":2,"unique_key":"cron","execute_class":"XF\\Job\\Cron","execute_data":{},"manual_execute":0,"trigger_date":1574879464,"last_run_date":1574879405,"trigger_date_formatted":"2019-11-27 18:31:04 UTC","last_run_date_formatted":"2019-11-27 18:30:05 UTC"}

[2019-11-27 23:48:03] Hampel\SparkPost:MessageEvent: Job executed in 0.90 seconds {"completed":true,"jobId":10,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":10,"unique_key":"SparkPostMessageEvents","execute_class":"Hampel\\SparkPost:MessageEvent","execute_data":{},"manual_execute":0,"trigger_date":1574898483,"last_run_date":null,"trigger_date_formatted":"2019-11-27 23:48:03 UTC","last_run_date_formatted":""}

[2019-11-27 23:48:03] Hampel\SparkPost:EmailBounce: Job executed in 0.02 seconds {"completed":true,"jobId":11,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":11,"unique_key":"SparkPostEmailBounce","execute_class":"Hampel\\SparkPost:EmailBounce","execute_data":{},"manual_execute":0,"trigger_date":1574898483,"last_run_date":null,"trigger_date_formatted":"2019-11-27 23:48:03 UTC","last_run_date_formatted":""}

No more runnable jobs pending

Отладка пользовательских заданий
Вы можете добавить дополнительную информацию для отладки в ваших собственных заданиях.

Добавьте функцию ниже в ваш класс задания, для выова функции logJobProgress класса Logger:
PHP:
    protected function log($message, array $context = [])
    {
        // проверяем, доступен ли логгер сейчас и прекращаем выполнение функции, если нет
        if (!isset($this->app['cli.logger'])) return;

        /** @var Logger $logger */
        $logger = $this->app['cli.logger'];
        $logger->logJobProgress($message, $context, $this);
    }

Затем вы можете вызвать функцию log() в коде вашего задания, для вывода информации в консоль, когда Job Runner запущен с режимом подробностей.

Например, посмотрите на тестовое задание, включенное в плагин (Hampel\JobRunner\Job\TestJob):
PHP:
    public function run($maxRunTime)
    {
        $this->log("About to start test job", $this->data);

        $mail = $this->app->mailer()->newMail();
        $mail->setTo($this->data['email']);
        $mail->setContent(
            "Test job",
            "This is an email sent from a test job"
        );
        $sent = $mail->send();

        $this->log("Sent mail", ['sent' => $sent]);

        return $this->complete();
    }

Код выше сгенерирует следующий вывод, если Job Runner запушен в режиме отдадки:
Bash:
$ php cmd.php hg:run-jobs -vvv
[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: About to start test job {"email":"[email protected]"} {"job_id":17,"class":"Hampel\\JobRunner\\Job\\TestJob","status_message":"Testing jobs","data":{"email":"[email protected]"},"execution_time":"0.00"}

[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: Sent mail {"sent":1} {"job_id":17,"class":"Hampel\\JobRunner\\Job\\TestJob","status_message":"Testing jobs","data":{"email":"[email protected]"},"execution_time":"0.95"}

[2019-11-28 00:26:21] Hampel\JobRunner:TestJob: Job executed in 0.95 seconds {"completed":true,"jobId":17,"continueDate":null,"continueDate_formatted":"","statusMessage":""} {"job_id":17,"unique_key":null,"execute_class":"Hampel\\JobRunner:TestJob","execute_data":{"email":"[email protected]"},"manual_execute":0,"trigger_date":1574900777,"last_run_date":null,"trigger_date_formatted":"2019-11-28 00:26:17 UTC","last_run_date_formatted":""}

No more runnable jobs pending
Если задание запущено в «тихом» режиме, вывод не будет показан, но, что более важно, если этот плагин отключен, код логгинга не требуется удалять из кода задания. Важная часть, это строка if(!isset(\XF::app['cli.logger'])) return;, которая прекращает выполнение функции, если класс Logger не доступен.

Отладка пользовательских заданий Cron
Используя схожий механизм, можно добавить отладку в пользовательские задания Cron:

Добавьте немного отличающуюся функцию в код вашего задания Cron для вызова функции log класса Logger:
PHP:
    protected static function log($message, array $context = [])
    {
        // проверяем, доступен ли логгер сейчас и прекращаем выполнение функции, если нет
        if (!isset(\XF::app['cli.logger'])) return;

        /** @var Logger $logger */
        $logger = \XF::app['cli.logger'];
        $logger->log("XF\Job\Cron", $message, $context);
    }

Затем, просто вызовите что-то вроде self::log("some message about something happening", ['key' => 'value']); в своем коде для вывода информации в консоль, когда Job Runner запущен с режимом подробностей.

Logger Trait
Так же доступен trait, который вы можете подключать в собственные классы: Hampel\JobRunner\Cli\LoggerTrait, который реализует некоторые базовые функции ведения журнала, которые вы можете вызвать из своего кода:
  • getLogger
  • log
  • logQuiet (будет отображено, даже если опция -q передана для Job Runner) - use this for critical errors only
  • logNormal
  • logVerbose
  • logVeryVerbose
  • debug
При развертывании плагина нет необходимости удалять код ведения журнала или отладки - при запуске hg:run-jobs в нормальном или «тихом режиме» вывод не будет отображен.

Нет необходимости удалять код ведения журнала или отладки - при запуске hg:run-jobs в нормальном или тихом режиме ни один из выходных данных не отображается, если он не использует logNormal или logQuiet (который следует использовать только для ошибки).


Версия для XenForo 2.0 и 2.1:
Автор
Hope
Скачивания
19
Просмотры
744
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Hope

Поделиться ресурсом

Последние обновления

  1. Обновление 2.1.1

    Совместимость с XF 2.3
  2. 2.0.0 Beta 3 (содержит критические изменения)

    XF 2.2.0 Beta 3 вносит некоторые внутренние изменения в способ управления файлами блокировки и...
  3. v2.0.0b2

    Удалено лишнее расширение класса благодаря XF 2.2.0b2
Назад
Сверху Снизу