Утилита Reduction предназначена для оптимизации размера изображений на сайте. Нередко пользователи загружают на сервер слишком большие изображения :)
Логика работы приложения следующая: сначала инспектируются директории на наличие файлов изображений (jpeg, png, gif) больших определённого размера, затем может быть произведена перезапись найденных файлов с оптимальной шириной и высотой (пропорции остануться правильными). Поиск файлов осуществляется рекурсивно.
Отбирать изображения можно не только по размеру файла, но и по размеру "длинной" стороны изображения. Настройки помещены в файл data/config.json
.
Чтобы ориентироваться сколько приложение выполняется по времени и потребляет памяти написан класс Marker. Результаты пишутся в лог.
Посмотрим на файл data/config.json
, в нём:
"folderPath"
- относительный путь к целевой директории изображений от app.php
"mode"
- режим выбора изображений либо "ImageSide"
, либо "FileSize"
"maxFileSize"
- в режиме "FileSize"
будут выбраны файлы больше указанного размера в байтах
"maxImageSide"
- в режиме "ImageSide"
будут выбраны файлы, у которых длинная сторона больше указанного здесь значения в пикселях
"maxWidth"
- ширина новых изображений, если изображения горизонтальные в пикселях
"maxHeight"
- высота новых изображений, если изображения вертикальные в пикселях
"ableTypes"
- массив расширений файлов, необязательно там должно быть 3 значения, выберите одно или два для "точечной" работы
"quality"
- показатель quality
при записи jpeg и png изображений функциями imagejpeg(), imagepng()
Рассмотрим случай, когда вы расположите директорию vendor
в корневой директории вашего сайта.
# перейдите в корневую директорию сайта
$ cd root-of-site
# потребуйте пакет navt/reduction
$ composer require navt/reduction:dev-master
# убедитесь, что в корневой директории нет файла app.php и директории data.
# выполните копирование
$ cp vendor/navt/reduction/app.php ./
$ cp -r vendor/navt/reduction/data ./
Отредактируйте data/config.json
и app.php
в соответствии с вашей текущей задачей.
Запустите скрипт
$ php -f app.php
Изначально в файле app.php
содержится код для инспектирования целевой директории. Если вы решили, что настало время уменьшить размер отобранных файлов, то код в app.php
нужно привести к виду:
<?php
chdir(__DIR__);
require_once __DIR__.'/vendor/autoload.php';
use navt\Reduction\Logger\Logger;
use navt\Reduction\Marker;
use navt\Reduction\Reduction;
$log = new Logger("data/app.log");
$marker = new Marker($log);
// создаём экземпляр Reduction, получаем список файлов, печатаем в лог
$reduct = new Reduction($log, "data/config.json");
$reduct->getList(); // создает список отфильтрованных файлов
$reduct->printList();
$marker->addMark(); // добавление метки времени
// уменьшаем размер файлов по списку, уничтожаем экземпляр Reduction
$reduct->reductAll(); // перезапись файлов
$reduct = null;
$marker->addMark();
// проверяем, что получилось
$reduct = new Reduction($log, "data/config.json");
$reduct->getList();
$reduct->printList();
$marker->addMark();
$marker->display();
Использование консоли является предпочтительным, потому что при достаточно больших объёмах изображений приложению потребуется время для решения задачи. Проведите оценочный запуск с небольшим количеством файлов, чтобы понимать с какой скоростью работает утилита.
Позаботьтесь о целостности своих данных: сделайте дамп директорий, где планируется проводить работы, запустите скрипт на тестовых данных на локальном компьютере, посмотрите, удовлетворяет ли вас результат.
Для работы с jpeg, png и gif-изображениями без анимации будет использоваться модуль PHP gd
.
Для работы с gif-изображениями, имеющими несколько слоёв(анимацию) на вашем сервере должен быть установлен модуль PHP imagick
. Если такого модуля нет, то gif с анимацией не будут затронуты.
Если вы собираетесь уменьшать gif-изображения, имеющие несколько слоёв, рассмотрите вариант отдельного запуска утилиты только для gif.