#битрикс
Скрипт для поиска тяжёлых изображений в Битриксе
Готовый PHP-скрипт проверяет файлы сайта, исключает служебные каталоги Битрикса и выводит изображения тяжелее 1 МБ с размером, датой и путём.
Скрипт обходит файлы сайта и выводит самые тяжёлые изображения. В результате видно размер каждого файла, дату изменения и путь на сервере.
На сайте могут годами копиться фотографии и баннеры весом по несколько мегабайт. Часть находится в каталоге, часть загружена в статьи, а некоторые файлы остались после старых обновлений сайта.
Искать такие изображения вручную неудобно. Инструменты разработчика в браузере показывают файлы только на открытой странице. Серверный скрипт позволяет проверить весь сайт сразу и получить список самых тяжёлых изображений с указанием их размера и расположения.
Создаём скрипт
Создайте в корне сайта файл:
find-heavy-images.php
Добавьте в него следующий код:
<?php
declare(strict_types=1);
// Скрипт должен запускаться только из консоли.
if (PHP_SAPI !== 'cli') {
http_response_code(404);
exit;
}
$documentRoot = realpath(__DIR__);
if ($documentRoot === false) {
exit("Не удалось определить корень сайта.\n");
}
// Выводим изображения тяжелее 1 МБ.
$minimumSize = 1024 * 1024;
// Эти папки сканировать не нужно.
$excludedDirectories = [
'/bitrix/cache/',
'/bitrix/managed_cache/',
'/bitrix/stack_cache/',
'/bitrix/html_pages/',
'/upload/resize_cache/',
'/upload/tmp/',
];
$allowedExtensions = [
'jpg',
'jpeg',
'png',
'gif',
'webp',
'avif',
'bmp',
'tif',
'tiff',
];
$images = [];
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$documentRoot,
FilesystemIterator::SKIP_DOTS
),
RecursiveIteratorIterator::LEAVES_ONLY,
RecursiveIteratorIterator::CATCH_GET_CHILD
);
foreach ($iterator as $file) {
if (!$file->isFile() || $file->isLink()) {
continue;
}
$absolutePath = $file->getPathname();
$relativePath = str_replace(
'\\',
'/',
substr($absolutePath, strlen($documentRoot))
);
foreach ($excludedDirectories as $excludedDirectory) {
if (strpos($relativePath, $excludedDirectory) === 0) {
continue 2;
}
}
$extension = strtolower($file->getExtension());
if (!in_array($extension, $allowedExtensions, true)) {
continue;
}
$size = $file->getSize();
if ($size < $minimumSize) {
continue;
}
$images[] = [
'path' => $relativePath,
'size' => $size,
'modified' => $file->getMTime(),
];
}
usort(
$images,
static function (array $first, array $second): int {
return $second['size'] <=> $first['size'];
}
);
echo 'Найдено тяжёлых изображений: ' . count($images) . PHP_EOL;
echo str_repeat('-', 100) . PHP_EOL;
foreach ($images as $image) {
printf(
"%8.2f МБ | %s | %s\n",
$image['size'] / 1024 / 1024,
date('Y-m-d H:i', $image['modified']),
$image['path']
);
}
Запускаем проверку
Подключитесь к серверу по SSH, перейдите в корень сайта и выполните:
php find-heavy-images.php
Скрипт выведет количество найденных файлов, а затем отсортирует их от самого тяжёлого к самому лёгкому. В каждой строке будут размер в мегабайтах, дата изменения и путь к файлу.
Не открывайте скрипт через браузер. В примере добавлена проверка PHP_SAPI, поэтому файл запускается только из консоли. После проверки удалите файл из корня сайта.
Как изменить порог
По умолчанию скрипт ищет изображения тяжелее 1 МБ. За это отвечает строка:
$minimumSize = 1024 * 1024;
Например, для поиска файлов тяжелее 500 КБ укажите 500 * 1024. Если нужно проверить только определённые форматы, уберите лишние расширения из массива $allowedExtensions.
Что делать с найденными файлами
Не удаляйте изображения сразу после проверки. Файл может использоваться в каталоге, инфоблоке, шаблоне, CSS или почтовом шаблоне.
Для каждого крупного файла сначала проверьте, где он выводится. После этого можно выбрать подходящее действие:
- сжать изображение без заметной потери качества;
- уменьшить его физические размеры;
- заменить исходник на WebP или AVIF, если это подходит проекту;
- удалить неиспользуемый файл только после проверки и резервной копии.
Короткий вывод
Серверный скрипт не заменяет профилирование скорости, но быстро показывает, где на сайте скопились самые тяжёлые изображения. С такого списка удобно начинать оптимизацию: сначала исправить крупнейшие файлы, затем перейти к остальным.