Администрирование
Кеш, логи и ошибки 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 'Ошибка записана в лог';
}