Когда PHP-приложение на Битрикс падает с ошибкой, первое, что нужно — узнать об этом как можно быстрее. Файл лога на сервере есть, но кто и когда его смотрит? Гораздо удобнее получать уведомление прямо в Телеграм — мгновенно, с текстом ошибки. В этой статье разберём полный цикл: настройку логирования ошибок PHP в Битрикс через .settings.php, создание Telegram-бота и скрипта-нотификатора, запуск через cron.
Зачем логировать ошибки PHP в Битрикс
Битрикс — сложная система с большим количеством внутренних компонентов, событий и хуков. Ошибки PHP в production-среде могут проявляться неочевидно: пользователь видит пустую страницу или некорректный результат, а вы узнаёте об этом из звонка клиента. Стандартный PHP error_log существует, но его удобство зависит от того, куда он пишет и кто его читает.
Битрикс предоставляет собственный механизм обработки исключений через секцию exception_handling в bitrix/.settings.php — он позволяет гибко настроить, какие ошибки перехватывать и куда их писать.
Настройка .settings.php: только критические ошибки
Добавляем в файл конфигурации bitrix/.settings.php секцию обработки ошибок. Вариант для отлова только критических, блокирующих ошибок:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
array ( 'debug' => true, 'handled_errors_types' => E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR, 'exception_errors_types' => E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR, 'ignore_silence' => false, 'assertion_throws_exception' => true, 'assertion_error_type' => 256, 'log' => array ( 'settings' => array ( 'file' => 'bitrix/modules/error.log', 'log_size' => 1000000, ), ), ), |
Расширенная конфигурация с предупреждениями
Если нужно логировать не только фатальные ошибки, но и предупреждения (например, для отладки), используйте расширенный вариант:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'exception_handling' => array ( 'value' => array ( 'debug' => true, 'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED, 'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING, 'ignore_silence' => false, 'assertion_throws_exception' => true, 'assertion_error_type' => 256, 'log' => array ( 'settings' => array ( 'file' => 'bitrix/log_errors.log', 'log_size' => 1000000, ), ), ), 'readonly' => false, ), |
В лог попадут строки с меткой UNCAUGHT_EXCEPTION — именно по этой метке скрипт-нотификатор будет находить критические ошибки.
Как создать бота Телеграм и получить токен
Перед написанием PHP-кода нужно подготовить Telegram-бота:
- Откройте Telegram и найдите @BotFather.
- Отправьте команду
/newbot, задайте имя и username бота. - BotFather выдаст токен вида
123456789:AAF...— сохраните его. - Напишите боту любое сообщение, затем откройте в браузере:
https://api.telegram.org/botВАШ_ТОКЕН/getUpdates - В ответе JSON найдите поле
chat.id— это ваш Chat ID для отправки сообщений.
PHP-скрипт отправки уведомлений в Телеграм
Создайте файл, например /home/bitrix/cron/error_notifier.php, со следующим содержимым:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php class ErrorNotifier { private $token = "ВАШ_ТОКЕН_ТЕЛЕГРАММ"; private $chatId = "CHAT_ID_ТЕЛЕГРАММ"; private $logFiles; public function __construct($logFiles) { $this->logFiles = (array)$logFiles; } private function sendTelegramMessage($message) { $params = array( 'chat_id' => $this->chatId, 'text' => $message, 'parse_mode' => 'HTML', ); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'https://api.telegram.org/bot' . $this->token . '/sendMessage'); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $params); $result = curl_exec($curl); if ($result === false) { error_log("Telegram cURL error: " . curl_error($curl)); } curl_close($curl); } public function checkLogs() { foreach ($this->logFiles as $logFile) { $logContent = file_get_contents($logFile) ?: ''; if (strpos($logContent, 'UNCAUGHT_EXCEPTION') !== false) { foreach (explode("n", $logContent) as $line) { if (strpos($line, 'UNCAUGHT_EXCEPTION') !== false) { $message = "Фатальная ошибка PHP:n" . htmlspecialchars($line); $this->sendTelegramMessage($message); } } } } } } $notifier = new ErrorNotifier([ $_SERVER["DOCUMENT_ROOT"] . '/bitrix/modules/error.log', ]); $notifier->checkLogs(); |
Запуск через cron
Добавьте задачу в crontab для периодической проверки лога, например раз в 10 минут:
|
1 2 |
crontab -u bitrix -e */10 * * * * php /home/bitrix/cron/error_notifier.php |
Убедитесь, что файл лога доступен для чтения пользователю, под которым запускается cron:
|
1 |
chmod 644 /home/b/SITE_ID/site/public_html/bitrix/modules/error.log |
Как не заспамить Телеграм при массовых ошибках
Если одна и та же ошибка повторяется сотни раз подряд (например, сбой подключения к БД), скрипт отправит сотни одинаковых сообщений. Чтобы этого избежать:
- Дедупликация по хешу — сохраняйте хеш последней отправленной ошибки в файл или Redis, и отправляйте повторно только если прошло достаточно времени.
- Ограничение частоты — добавьте флаг-файл с временем последней отправки:
|
1 2 3 4 5 6 |
$lockFile = '/tmp/tg_error_lock'; $lastSent = file_exists($lockFile) ? (int)file_get_contents($lockFile) : 0; if (time() - $lastSent < 600) { exit; // Не чаще раза в 10 минут } file_put_contents($lockFile, time()); |
- Очистка лога после прочтения — после обработки записей обнуляйте лог, чтобы не перечитывать старые ошибки. Либо сохраняйте номер последней прочитанной строки.
Просмотр логов на сервере
Помимо Telegram-уведомлений полезно уметь просматривать логи вручную. Основные команды:
|
1 2 3 4 5 6 7 8 9 10 11 |
# Посмотреть последние 50 строк лога tail -n 50 /home/b/SITE_ID/site/public_html/bitrix/modules/error.log # Следить за логом в реальном времени tail -f /home/b/SITE_ID/site/public_html/bitrix/modules/error.log # Найти все строки с UNCAUGHT_EXCEPTION grep 'UNCAUGHT_EXCEPTION' /home/b/SITE_ID/site/public_html/bitrix/modules/error.log # Очистить лог > /home/b/SITE_ID/site/public_html/bitrix/modules/error.log |
Итог
Связка «Битрикс .settings.php + PHP-скрипт + cron + Telegram Bot API» даёт простую и надёжную систему мониторинга ошибок без сторонних платных сервисов. Вы узнаёте о критических проблемах в течение 10 минут после их появления, не заходя на сервер. При необходимости схему легко расширить: добавить несколько чатов, фильтровать по типу ошибок, интегрировать с системой тикетов.
