Виявляється картинки на ваших сайтах важать більше, ніж належить. Відбувається це через не оптимальних алгоритмів стиснення за допомогою різних програм. До речі, фотошоп File-> Save for web досить добре оптимізує зображення. А ось ACDSee і вже тим більше php-бібліотеки типу GD дають далеко не оптимальний результат.
Крім того, в зображенні міститься додаткова текстова інформація: дата знімка, параметри зйомки, модель фотоапарата і т.д. Нехай це 1%, але навіщо це завантажувати користувачеві.
Все нижче перераховане відноситься до стиснення без втрати якості. Тобто картинка візуально ті втрачає якості.
Одна з цих картинок важить 1.7 кб, інша 2.3 кб
Одна з цих картинок важить 32 кб, інша 42 кб
Для чого це потрібно?
Для того, щоб прискорити завантаження сторінки, особливо для мобільних пристроїв (пост про мобільники буде пізніше). Ну і місце на диску не у всіх гумове.
Наприклад, для цього поста. де половина фоток була оптимізована Фотошопом, стиснення дало 5%, начебто не так багато, але в абсолютному значенні це 250Кб, що вже добре.
І ще я помітив, старі фотки від перших цифрових камер або старі скани стискаються на 50%. Хоча зовні ці фотки виглядають і так стислими до межі.
З чого почати?
Стиснення виробляється за допомогою бібліотек, які потрібно встановити на сервер
для jpg: Jpegoptim
установка apt-get install jpegoptim
для png: OptiPNG
установка apt-get install optipng
для gif: gifsicle
установка apt-get install gifsicle
як стискати
З консолі запускаємо
Є команди для стиснення всіх картинок в директорії, але все одно ручками замучить. Тому процес потрібно автоматизувати. Взагалі, вся затія нижче має сенс, якщо у вас десятки сайтів і десятки тисяч зображення.
При цьому потрібно запам'ятовувати, що ми вже оптимізували, щоб не робити подвійну роботу. До речі, якщо зображення вже було оптимізовано, але при повторній оптимізації із зображенням нічого не відбувається.
облік картинок
Найзручніше зберігати шляхи до зображень в базі і періодично (по крону) оптимізувати їх.
Створимо окрему базу img з єдиною таблицею img
Прапор is_compress - показує статус обробки
0 - ще не оптимізували
1 - успішно оптимізували
2 - помилка при оптимізації
Власне, це рекурсивна функція, яка обходить всі піддиректорії і записує шляху в таблицю img. Тобто вам потрібно попередньо зібрати список всіх основних директорій з картинками. Якщо картинок багато, то зібрати картинки одним махом у вигляді recursive (сервер) може привести до зависання, тому що рекурсія трудомістка процедура для сервера.
На кожному сайті є 1-2 точки завантаження зображень (типу /ajax/upload.php)
У ці скрипти потрібно вставити
Як варіант, оптимізувати зображення на льоту, тобто відразу в скрипті прописувати
shell_exec ( "jpegoptim" .escapeshellarg ($ _ SERVER [ 'DOCUMENT_ROOT']. $ sFileLocalPath). "--strip-all");
Але зберігання в єдиній базі якось додає більше порядку.
Запускаємо Берлагу оптимізацію
Беремо кожну картинку і за допомогою shell_exec () запускаємо потрібний процес (jpegoptim, optipng, gifsicle) в залежності від розширення файлу.
Не потрібно брати відразу всю таблицю - сервер повисне. Брем по 5-100 зображень за раз. Вішаємо цей скрипт в cron на кожну хвилину. Тобто при додаванні нової картинки на сайт - вона буде оптимізована протягом хвилини.
$ Result - це текстовий результат стиснення. У ньому міститься наскільки відсотків ужался файл - помічаємо прапором is_compress = 1. Якщо такої інформації немає, то сталася помилка і помічаємо цей файл прапором is_compress = 2
Ось так це виглядає при виведенні на екран (echo $ result. '
';)
Як правило, помилки відбуваються через неправильне розширення файлу. Наприклад, була гифка, а на сайті у неї розширення jpg - при цьому браузери можуть нормально її відображати. Можна було звичайно по mime-type визначати розширення.
Права на файли
Оскільки shell_exec виконується з php-скрипта, то і власник у зображень повинен бути як у Апача, тобто www-data.
Часто буває так, що сайт був залитий через ftp під root, тому з php оптимізувати і перезаписати такі файли не вийде.
Тому потрібно переконатися, що потрібні директорії і файли належать www-data і виставлені права. У директорій, в які заливаються файли, права 755, а у зображень 644.
Зробити це можна через консоль, ftp-менеджер або ISP-менеджер (зручна штука для адміністрування сервером)