- Для версий
- 2.2
- 2.3
Описание CLI Job / Cron Runner:
Этот аддон реализует усовершенствованный инструмент выполнения заданий и cron-задач через CLI для XenForo 2.x. Он заменяет встроенную команду xf:run-jobs, предоставляя дополнительные функции и гибкость.Особенности CLI Job / Cron Runner:
- Расширенные возможности выполнения заданий:
- Обработка заданий и cron-задач до 10 минут за запуск.
- Использование файла блокировки для предотвращения параллельного выполнения.
- Подходит для сайтов с высокой нагрузкой.
- Диагностика и отладка:
- Подробный вывод отладочной информации для тестирования и идентификации проблем.
- Команды CLI:
- hg:run-jobs: аналог xf:run-jobs с улучшенным функционалом.
- hg:show-jobs: отображает все текущие задания.
- hg:show-crons: отображает все задачи XenForo Cron.
- hg:run-cron: выполняет указанную задачу Cron.
Требования CLI Job / Cron Runner:
- PHP: версия 7.0 или выше.
- XenForo: версии 2.2 и 2.3.
Установка CLI Job / Cron Runner:
Установите аддон как обычно.После установки перейдите на страницу параметров системы и производительности и измените настройку триггера запуска заданий на «Триггер на базе сервера».
Для начала необходимо проверить, что программа запуска заданий работает - выполните следующую команду в CLI:
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, чтобы запускать ее по выбранному вами расписанию.
ПРИМЕЧАНИЕ: если у вас уже есть задача cron, настроенная на запуск xf:run-jobs, просто отключите ее и замените идентичной задачей, запускающей вместо нее hg:run-jobs.
Подход № 1 с использованием crontab:
Настоятельно рекомендуется запускать задачу cron от имени пользователя веб-сервера, чтобы избежать возможных проблем с правами.
Например, на Ubuntu с пользователем веб-сервера www-data установите задачу cron, выполнив следующую команду:
Bash:
$ sudo crontab -u www-data -e
Bash:
* * * * * php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs
Подход № 2 с использованием cron.d:
Вместо использования кронтаба некоторые дистрибутивы Linux создают хорошо известный каталог, который автоматически проверяется на наличие заданий cron для выполнения. В случае с Ubuntu вы можете создать файлы в
/etc/cron.d/,
где вы укажете расписание, пользователя, от имени которого будет выполняться команда, и саму команду.Создайте файл в /etc/cron.d/ со следующим содержимым:
Bash:
* * * * * webserver-user php /path/to/your/forum/root/cmd.php --quiet hg:run-jobs
Опять же, используя наш предыдущий пример, где пользователь веб-сервера - 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
По умолчанию бегунок запускается максимум на 30 секунд, выполняя все невыполненные задания до тех пор, пока в очереди не останется ни одного выполнимого задания.
Обновление с аддона v1.x после обновления XenForo до версии 2.2
В версии 2.0 этого аддона изменено имя команды и максимально допустимое время выполнения. Также обратите внимание, что опция --time в v1.x была переименована в --max-execution-time в соответствии с основным исполнителем заданий, представленным в XF v2.2.
Для обновления:
- Обновитесь до XF v2.2 RC2 или более поздней версии
- Установите аддон версии 2.0.x
- измените запись в вашем unix cron, чтобы он выполнял hg:run-jobs вместо xf:run-jobs
- если вы используете опцию --time, переименуйте ее в --max-execution-time
- опция --max-execution-time: установите любое значение до 600 секунд (10 минут), чтобы позволить заданию обрабатываться столько, сколько ему нужно. Например: --max-execution-time=180 позволит бегуну заданий выполняться до 3 минут за раз.
Конфигурация
Вы можете настроить максимальное время выполнения задания, указав в командной строке параметр --max-execution-time=[TIME].Например, чтобы позволить исполнителю выполнять задание не более 45 секунд:
Bash:
$ php <path to your forum root>/cmd.php --max-execution-time=45 hg:run-jobs
Максимально допустимое время выполнения - 10 минут (600 секунд). Команда будет выполняться до тех пор, пока не найдет больше невыполненных заданий, а затем остановится - поэтому время выполнения обычно составляет всего несколько секунд.
Для дальнейшей настройки выполнения заданий вы также можете отрегулировать максимальное время выполнения каждого задания.
Это настраивается с помощью опции XenForo config.php:
Bash:
$config['jobMaxRunTime'] = 8;
В общем случае рекомендуется оставить это значение относительно небольшим, чтобы избежать ситуации, когда одно очень длинное задание может помешать своевременному выполнению других заданий. Возможно, потребуется немного поэкспериментировать, чтобы найти оптимальное значение для нагрузки на ваш сервер и размера форума. Если вы сомневаетесь, оставьте значение по умолчанию - 8 секунд.
Использование
Команда run-jobs должна выполняться автоматически с помощью задачи cron, как указано выше.
Показать задания
Команда hg:show-jobs выводит список всех текущих заданий, чтобы вы могли видеть, насколько заполнена очередь заданий.
По умолчанию будут показаны только 100 следующих по расписанию заданий, но вы можете использовать опцию
--all
, чтобы показать полный список всех ожидающих заданий.Всегда должно отображаться как минимум два задания: основное задание Cron и задание проверки обновлений.
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)
Для выявления проблем с заданиями и заданиями Cron существуют обширные инструменты отладки.
Для запуска в режиме отладки сначала отключите Unix cron, который запускает задания автоматически (не забудьте включить его снова, как только закончите отладку!), а затем используйте опции verbosity (Verbose: -v, Very verbose: -vv или Debug: -vv) для команды hg:run-jobs, чтобы указать уровень вывода на консоль.
Вывод осуществляется на консоль и имеет формат, аналогичный тому, который используется библиотекой Monolog (хотя мы не используем Monolog для генерации вывода).
Например, опция Verbose -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
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
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 = [])
{
// check to see if we actually have a logger available and abort if not
if (!isset($this->app['cli.logger'])) return;
/** @var Logger $logger */
$logger = $this->app['cli.logger'];
$logger->logJobProgress($message, $context, $this);
}
Например, смотрите тестовое задание, включенное в этот аддон 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();
}
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
Отладка пользовательских задач Cron
Используя аналогичный механизм, мы можем добавить отладочный код и в наши пользовательские задачи Cron:
Добавьте в свои задачи Cron немного другую функцию для вызова функции log() нашего класса Logger:
PHP:
protected static function log($message, array $context = [])
{
// check to see if we actually have a logger available and abort if not
if (!isset(\XF::app['cli.logger'])) return;
/** @var Logger $logger */
$logger = \XF::app['cli.logger'];
$logger->log("XF\Job\Cron", $message, $context);
}
Трейт Logger
Существует также трейт, который вы можете включить в свои классы: Hampel\JobRunner\Cli\LoggerTrait, который реализует некоторые базовые функции ведения журнала, которые вы можете вызывать из своего кода:
- getLogger
- log
- logQuiet (будет показан, даже если для Job Runner указана опция -q) - используйте только для критических ошибок
- logNormal (будет отображаться при отсутствии многозначности и выше)
- logVerbose (будет показан только для опции -v или выше)
- logVeryVerbose (будет показан только для опции -vv или выше)
- debug (будет отображаться только в том случае, если для бегуна заданий указан параметр -vv)
Отладка задач Cron
Начиная с версии 2.0 beta 3, появились две новые команды для работы с задачами XF cron:
Show Crons
Команда hg:show-crons выводит список всех активных задач XF cron
Bash:
$ cmd.php hg:show-crons
19 active cron entries found
+---------------------------+----------------------+--------------------------+
| ID | Next Run (UTC+10:00) | Addon |
+---------------------------+----------------------+--------------------------+
| forumStatistics | 29-Sep-2020 06:53 | XF |
| emailBounce | 29-Sep-2020 06:53 | XF |
| warningExpiry | 29-Sep-2020 06:55 | XF |
| rebuildSearchForumCache | 29-Sep-2020 07:00 | XF |
| memberStatsCache | 29-Sep-2020 07:00 | XF |
| feeder | 29-Sep-2020 07:02 | XF |
| cleanUpHourly | 29-Sep-2020 07:10 | XF |
| emailUnsubscribe | 29-Sep-2020 07:13 | XF |
| userGroupPromotions | 29-Sep-2020 07:20 | XF |
| views | 29-Sep-2020 07:30 | XF |
| trophy | 29-Sep-2020 07:40 | XF |
| expireTempUserChanges | 29-Sep-2020 07:42 | XF |
| deleteExpiredBans | 29-Sep-2020 07:45 | XF |
| downgradeExpired | 29-Sep-2020 07:50 | XF |
| fileCheck | 29-Sep-2020 10:10 | XF |
| dailyStats | 29-Sep-2020 10:30 | XF |
| cleanUpDaily | 29-Sep-2020 13:00 | XF |
| activitySummaryEmail | 30-Sep-2020 00:20 | XF |
| sitemap | 30-Sep-2020 15:37 | XF |
+---------------------------+----------------------+--------------------------+
The current time is: 29-Sep-2020 06:52:05 (UTC+10:00)
- -a или --all показывает все задачи cron, включая отключенные задачи
- -m или --method включает класс::метод для каждой задачи cron
- -s или --sort задает колонку сортировки списка (дата, id или addon).
Запуск Cron
Команда hg:run-cron выполнит задачу XF cron - просто укажите в качестве аргумента идентификатор cron.Например: cmd.php hg:run-cron activitySummaryEmail запустит cron-задачу «Отправка сводки активности по электронной почте».
По умолчанию отключенные задачи cron не могут быть запущены, поэтому вы можете отменить это, указав в командной строке опцию -f или --force.
Здесь работают те же флаги многословия, поэтому укажите -v, -vv или -vv, чтобы получить необходимый уровень вывода.