#битрикс

Скрипт для поиска тяжёлых изображений в Битриксе

Готовый PHP-скрипт проверяет файлы сайта, исключает служебные каталоги Битрикса и выводит изображения тяжелее 1 МБ с размером, датой и путём.

Поиск тяжёлых изображений на сайте 1С-Битрикс
Если коротко

Скрипт обходит файлы сайта и выводит самые тяжёлые изображения. В результате видно размер каждого файла, дату изменения и путь на сервере.

На сайте могут годами копиться фотографии и баннеры весом по несколько мегабайт. Часть находится в каталоге, часть загружена в статьи, а некоторые файлы остались после старых обновлений сайта.

Искать такие изображения вручную неудобно. Инструменты разработчика в браузере показывают файлы только на открытой странице. Серверный скрипт позволяет проверить весь сайт сразу и получить список самых тяжёлых изображений с указанием их размера и расположения.

Создаём скрипт

Создайте в корне сайта файл:

find-heavy-images.php

Добавьте в него следующий код:

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 МБ. За это отвечает строка:

PHP
$minimumSize = 1024 * 1024;

Например, для поиска файлов тяжелее 500 КБ укажите 500 * 1024. Если нужно проверить только определённые форматы, уберите лишние расширения из массива $allowedExtensions.

Что делать с найденными файлами

Не удаляйте изображения сразу после проверки. Файл может использоваться в каталоге, инфоблоке, шаблоне, CSS или почтовом шаблоне.

Для каждого крупного файла сначала проверьте, где он выводится. После этого можно выбрать подходящее действие:

  • сжать изображение без заметной потери качества;
  • уменьшить его физические размеры;
  • заменить исходник на WebP или AVIF, если это подходит проекту;
  • удалить неиспользуемый файл только после проверки и резервной копии.

Короткий вывод

Серверный скрипт не заменяет профилирование скорости, но быстро показывает, где на сайте скопились самые тяжёлые изображения. С такого списка удобно начинать оптимизацию: сначала исправить крупнейшие файлы, затем перейти к остальным.

Сайт использует файлы cookie, обрабатываемые вашим браузером. Подробнее об этом вы можете узнать в Политике обработки персональных данных.
ПринятьНастроитьОтклонить