← Назад к справке

Администрирование

Кеш, логи и ошибки PHP

Рабочая справка по кешу, логам и ошибкам PHP в коробочном Bitrix24: очистка кеша, Debug, AddMessage2Log, exception_handling и диагностика 500 ошибок.

Если правка не видна, сначала проверяю кеш. Если страница падает, сначала смотрю PHP-ошибку. Если ошибка появляется только в AJAX, агенте или cron, пишу данные в файл через Debug::dumpToFile() или свой лог.

Кеш Битрикса

Кеш может скрывать изменения в шаблонах, компонентах, ORM-запросах и меню.

Где лежит кеш

Папка Что там обычно лежит
/bitrix/cache/ Файловый кеш компонентов и данных.
/bitrix/managed_cache/ Управляемый кеш.
/bitrix/html_pages/ Композитный кеш, если используется композит.
/upload/resize_cache/ Кеш уменьшенных изображений.

В настройках ядра можно менять движок кеширования и корневую папку файлового кеша. Поэтому на конкретном проекте путь лучше дополнительно проверить в настройках.

Очистить кеш из PHP

<?php

use Bitrix\Main\Data\Cache;

/**
 * Очищает кеш по ключу и директории.
 */
function clearCacheByKey(string $cache_key, string $cache_dir): void
{
    $cache = Cache::createInstance();

    $cache->clean($cache_key, $cache_dir);
}

/**
 * Очищает кеш директории.
 */
function clearCacheDirectory(string $cache_dir): void
{
    $cache = Cache::createInstance();

    $cache->cleanDir($cache_dir);
}

clearCacheDirectory('/custom/example');

Если нужно сбросить кеш интерфейсно, обычно используют административную очистку кеша. В коде лучше чистить только свой конкретный кеш, а не весь проект.

Пример кеширования

<?php

use Bitrix\Main\Data\Cache;

const CACHE_TTL = 3600;
const CACHE_DIR = '/custom/example';

/**
 * Получает данные с кешированием.
 */
function fetchCachedItems(string $cache_key): array
{
    $cache = Cache::createInstance();

    if ($cache->initCache(CACHE_TTL, $cache_key, CACHE_DIR)) {
        $cached_data = $cache->getVars();

        return is_array($cached_data) ? $cached_data : [];
    }

    if ($cache->startDataCache()) {
        $items = [
            'example' => 'value',
        ];

        if (empty($items)) {
            $cache->abortDataCache();

            return [];
        }

        $cache->endDataCache($items);

        return $items;
    }

    return [];
}

$items = fetchCachedItems('items_v1');

print_r($items);

Логи

Для отладки лучше писать понятный лог с контекстом: ID сущности, пользователь, действие, ошибка.

Debug::dumpToFile

Debug::dumpToFile() удобен для AJAX, cron, агентов и обработчиков, где нельзя просто вывести print_r() на экран.

<?php

use Bitrix\Main\Diag\Debug;

/**
 * Пишет данные в debug-файл.
 */
function writeDebugLog($data, string $label): void
{
    Debug::dumpToFile(
        $data,
        $label,
        '/local/logs/debug.log'
    );
}

writeDebugLog(
    [
        'deal_id' => 123,
        'status' => 'start',
    ],
    'crm_debug'
);

AddMessage2Log

AddMessage2Log() — старый, но всё ещё часто встречающийся способ быстро записать данные в лог.

<?php

/**
 * Пишет сообщение в лог Битрикса.
 */
function writeBitrixLog(string $message, array $context = []): void
{
    AddMessage2Log(
        [
            'message' => $message,
            'context' => $context,
        ],
        'custom_debug'
    );
}

writeBitrixLog(
    'Проверка обработчика',
    [
        'user_id' => 1,
        'deal_id' => 123,
    ]
);

Свой лог-файл

<?php

const CUSTOM_LOG_FILE = '/local/logs/custom.log';

/**
 * Пишет строку в свой лог.
 */
function writeCustomLog(string $message, array $context = []): void
{
    $log_file = $_SERVER['DOCUMENT_ROOT'] . CUSTOM_LOG_FILE;

    $log_dir = dirname($log_file);

    if (!is_dir($log_dir)) {
        mkdir($log_dir, 0775, true);
    }

    $line = sprintf(
        "[%s] %s %s\n",
        date('Y-m-d H:i:s'),
        $message,
        json_encode($context, JSON_UNESCAPED_UNICODE)
    );

    file_put_contents($log_file, $line, FILE_APPEND);
}

writeCustomLog('Скрипт запущен', ['user_id' => 1]);

Ошибки PHP

Ошибки PHP в коробке зависят от настроек PHP, веб-сервера и обработчика ошибок Bitrix.

Где включается обработка ошибок

В ядре Bitrix есть секция exception_handling в настройках. Там задаётся, показывать ли ошибки на экран и какие типы ошибок обрабатывать.

'exception_handling' => [
    'value' => [
        'debug' => false,
        'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE,
        'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT,
        'ignore_silence' => false,
        'assertion_throws_exception' => true,
    ],
],

На боевом портале вывод ошибок на экран лучше не включать надолго. Для диагностики безопаснее писать ошибки в лог.

Что смотреть при 500 ошибке

  • логи PHP-FPM или Apache/Nginx;
  • логи Bitrix и свои /local/logs;
  • последние изменения в init.php;
  • обработчики событий;
  • локальные модули;
  • ошибки автозагрузки классов;
  • несовместимость старого кода с текущей версией PHP.

try-catch для служебных скриптов

<?php

use Bitrix\Main\Diag\Debug;

/**
 * Пишет исключение в лог.
 */
function writeExceptionLog(\Throwable $exception): void
{
    Debug::dumpToFile(
        [
            'message' => $exception->getMessage(),
            'file' => $exception->getFile(),
            'line' => $exception->getLine(),
            'trace' => $exception->getTraceAsString(),
        ],
        'exception',
        '/local/logs/exceptions.log'
    );
}

try {
    // Основной код скрипта
} catch (\Throwable $exception) {
    writeExceptionLog($exception);

    echo 'Ошибка записана в лог';
}

Источники