Skip to content

Команды Messenger

Стандартная команда Битрикс для работы с очередью Messenger: запуск worker для обработки асинхронных задач.

messenger:consume

Запускает worker для обработки сообщений из очереди Битрикс Messenger в фоновом режиме.

Синтаксис

bash
php bitrix.php messenger:consume [queues] [опции]

Аргументы

  • queues - названия очередей для обработки (необязательный, можно указать несколько через пробел)

Опции

  • --time-limit=<секунды> или -t - ограничение времени работы worker'а
  • --sleep=<секунды> - время ожидания перед запросом новых сообщений после итерации (по умолчанию: 1)

Примеры использования

bash
# Запуск worker для всех очередей
php bitrix.php messenger:consume

# Для конкретных очередей
php bitrix.php messenger:consume queue1 queue2

# С ограничением времени работы (1 час)
php bitrix.php messenger:consume --time-limit=3600

# С настройкой задержки между итерациями (5 секунд)
php bitrix.php messenger:consume --sleep=5

# Комбинированный пример
php bitrix.php messenger:consume notifications messages \
  --time-limit=7200 \
  --sleep=3

Настройка

Конфигурация в .settings.php

Для работы команды необходимо настроить режим работы Messenger в .settings.php:

php
<?php
return [
    'messenger' => [
        'value' => [
            'run_mode' => 'cli',  // Использовать CLI режим
        ],
        'readonly' => false,
    ],
];

Создание systemd service

ini
# /etc/systemd/system/bitrix-messenger.service
[Unit]
Description=Bitrix Messenger Worker
After=network.target mysql.service redis.service
Requires=mysql.service

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/bitrix
ExecStart=/usr/bin/php bitrix.php messenger:consume --time-limit=3600
Restart=always
RestartSec=10

# Логирование
StandardOutput=append:/var/log/bitrix-messenger.log
StandardError=append:/var/log/bitrix-messenger-error.log

# Ресурсы
LimitNOFILE=65535
Nice=10

[Install]
WantedBy=multi-user.target

Активация service:

bash
sudo systemctl enable bitrix-messenger.service
sudo systemctl start bitrix-messenger.service
sudo systemctl status bitrix-messenger.service

Использование

Запуск в фоновом режиме

bash
#!/bin/bash
# Запуск worker в фоновом режиме с логированием

cd /var/www/bitrix

nohup php bitrix.php messenger:consume \
  --time-limit=3600 \
  --sleep=2 \
  >> /var/log/bitrix-messenger.log 2>&1 &

echo "Messenger worker запущен в фоне"

Запуск с автоперезапуском

bash
#!/bin/bash
# Скрипт с автоматическим перезапуском при падении

cd /var/www/bitrix

while true; do
    echo "Запуск messenger worker: $(date)"
    
    php bitrix.php messenger:consume \
        --time-limit=3600 \
        --sleep=2
    
    EXIT_CODE=$?
    echo "Worker завершился с кодом: $EXIT_CODE"
    
    # Если worker был остановлен намеренно (SIGTERM), не перезапускать
    if [ $EXIT_CODE -eq 143 ]; then
        echo "Worker остановлен, выход"
        break
    fi
    
    # Пауза перед перезапуском
    echo "Перезапуск через 10 секунд..."
    sleep 10
done

Мониторинг worker'а

bash
#!/bin/bash
# Проверка работы messenger worker

PROCESS_COUNT=$(ps aux | grep "[m]essenger:consume" | wc -l)

if [ $PROCESS_COUNT -eq 0 ]; then
    echo "⚠ Messenger worker не запущен!"
    
    # Отправить уведомление
    echo "ВНИМАНИЕ: Messenger worker не работает" | \
        mail -s "Messenger Worker Down" admin@example.com
    
    # Перезапустить (если используется systemd)
    sudo systemctl start bitrix-messenger.service
elif [ $PROCESS_COUNT -gt 3 ]; then
    echo "⚠ Слишком много worker процессов: $PROCESS_COUNT"
else
    echo "✓ Messenger worker работает ($PROCESS_COUNT процессов)"
fi

Продвинутые сценарии

Множественные worker'ы для разных очередей

bash
#!/bin/bash
# Запуск разных worker'ов для разных типов очередей

cd /var/www/bitrix

# Worker для высокоприоритетных сообщений
nohup php bitrix.php messenger:consume high-priority \
  --time-limit=3600 \
  --sleep=1 \
  >> /var/log/messenger-high.log 2>&1 &

# Worker для обычных сообщений
nohup php bitrix.php messenger:consume normal \
  --time-limit=3600 \
  --sleep=2 \
  >> /var/log/messenger-normal.log 2>&1 &

# Worker для фоновых задач
nohup php bitrix.php messenger:consume background \
  --time-limit=3600 \
  --sleep=5 \
  >> /var/log/messenger-background.log 2>&1 &

echo "Множественные worker'ы запущены"

Динамическое масштабирование

bash
#!/bin/bash
# Запуск дополнительных worker'ов при высокой нагрузке

cd /var/www/bitrix

# Получить количество сообщений в очереди (требуется Redis)
QUEUE_SIZE=$(redis-cli LLEN bitrix:messenger:queue)
WORKERS_COUNT=$(ps aux | grep "[m]essenger:consume" | wc -l)

# Минимум и максимум worker'ов
MIN_WORKERS=2
MAX_WORKERS=10

if [ "$QUEUE_SIZE" -gt 1000 ] && [ "$WORKERS_COUNT" -lt "$MAX_WORKERS" ]; then
    echo "Высокая нагрузка, запуск дополнительного worker'а"
    nohup php bitrix.php messenger:consume \
        --time-limit=1800 \
        --sleep=1 \
        >> /var/log/messenger-extra.log 2>&1 &
elif [ "$QUEUE_SIZE" -lt 100 ] && [ "$WORKERS_COUNT" -gt "$MIN_WORKERS" ]; then
    echo "Низкая нагрузка, лишние worker'ы завершатся автоматически"
fi

Логирование и статистика

bash
#!/bin/bash
# Worker с детальным логированием и статистикой

cd /var/www/bitrix

LOG_FILE="/var/log/bitrix-messenger-$(date +%Y%m%d).log"
STATS_FILE="/var/log/bitrix-messenger-stats.log"

{
    echo "=== Messenger Worker Start: $(date) ==="
    
    START_TIME=$(date +%s)
    
    php bitrix.php messenger:consume \
        --time-limit=3600 \
        --sleep=2 \
        -vv
    
    END_TIME=$(date +%s)
    DURATION=$((END_TIME - START_TIME))
    
    echo "=== Messenger Worker Stop: $(date) ==="
    echo "Duration: $DURATION seconds"
    echo ""
    
    # Записать статистику
    echo "$(date +%Y-%m-%d\ %H:%M:%S),$DURATION" >> "$STATS_FILE"
    
} >> "$LOG_FILE" 2>&1

Интеграция с Supervisor

ini
# /etc/supervisor/conf.d/bitrix-messenger.conf
[program:bitrix-messenger]
command=/usr/bin/php /var/www/bitrix/bitrix.php messenger:consume --time-limit=3600 --sleep=2
directory=/var/www/bitrix
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/bitrix-messenger.log
stderr_logfile=/var/log/bitrix-messenger-error.log
stopwaitsecs=60

# Количество процессов
numprocs=2
process_name=%(program_name)s_%(process_num)02d

Активация:

bash
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start bitrix-messenger:*
sudo supervisorctl status

Мониторинг и отладка

Проверка логов

bash
#!/bin/bash
# Анализ логов messenger worker'а

LOG_FILE="/var/log/bitrix-messenger.log"

echo "=== Последние 50 строк лога ==="
tail -n 50 "$LOG_FILE"

echo ""
echo "=== Ошибки за последние 24 часа ==="
grep -i "error\|exception\|fatal" "$LOG_FILE" | tail -n 20

echo ""
echo "=== Статистика обработки ==="
grep "Processed" "$LOG_FILE" | tail -n 10

Dashboard статистики

bash
#!/bin/bash
# Создание дашборда статистики

echo "╔════════════════════════════════════════╗"
echo "║   Bitrix Messenger Worker Status      ║"
echo "╚════════════════════════════════════════╝"
echo ""

# Количество запущенных worker'ов
WORKERS=$(ps aux | grep "[m]essenger:consume" | wc -l)
echo "Active Workers: $WORKERS"

# Размер очереди (если используется Redis)
if command -v redis-cli &> /dev/null; then
    QUEUE_SIZE=$(redis-cli LLEN bitrix:messenger:queue 2>/dev/null || echo "N/A")
    echo "Queue Size: $QUEUE_SIZE"
fi

# Uptime systemd service (если используется)
if systemctl is-active bitrix-messenger.service &> /dev/null; then
    UPTIME=$(systemctl status bitrix-messenger.service | \
             grep "Active:" | awk '{print $3, $4}')
    echo "Service Uptime: $UPTIME"
fi

# Последние ошибки
ERROR_COUNT=$(grep -c "ERROR" /var/log/bitrix-messenger.log 2>/dev/null || echo "0")
echo "Errors (24h): $ERROR_COUNT"

echo ""

Troubleshooting

Worker не запускается

Проблема: Команда не запускается или сразу завершается

Решения:

  1. Проверьте настройки в .settings.php: run_mode должен быть cli
  2. Убедитесь, что модуль Messenger установлен и активен
  3. Проверьте подключение к очереди (Redis/RabbitMQ)
  4. Проверьте логи PHP и Битрикс

Сообщения не обрабатываются

Проблема: Worker работает, но сообщения остаются в очереди

Решения:

  1. Проверьте логи worker'а на наличие ошибок
  2. Увеличьте количество worker'ов
  3. Уменьшите --sleep для более частой обработки
  4. Проверьте производительность сервера
  5. Проверьте настройки очереди

Высокое потребление ресурсов

Проблема: Worker потребляет много CPU/памяти

Решения:

  1. Увеличьте --sleep для снижения частоты опроса
  2. Уменьшите количество worker'ов
  3. Оптимизируйте обработчики сообщений
  4. Ограничьте ресурсы через systemd (LimitCPU, MemoryLimit)

Worker'ы дублируются

Проблема: Запускается слишком много worker'ов

Решения:

  1. Используйте systemd или supervisor для управления
  2. Добавьте проверку перед запуском
  3. Используйте lock-файлы для предотвращения дублирования

Полезные советы

💡 Используйте systemd/supervisor - для надежного управления worker'ами

💡 Мониторьте - отслеживайте работу worker'ов и размер очереди

💡 Масштабируйте - запускайте несколько worker'ов при высокой нагрузке

💡 Логируйте - ведите детальные логи для отладки

💡 Ограничивайте время - используйте --time-limit для периодического перезапуска

💡 Настройте алерты - получайте уведомления при проблемах


Смотрите также

Документация BXMax CLI