Оптимизация изображений

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

andrij
andrij
Репутация: 0
Сообщения: 19
Зарегистрирован: 07.02.2017
С нами: 2 года 3 месяца

Сообщение #1 andrij » 15.02.2017, 16:18

Для поисковиков очень важен фактор скорости загрузки страници

Когда движок обрезает картинки товара то они очень не оптимизировани


jpegtran optimize JPEG images
optipng lossless PNG optimization
pngquant lossy PNG optimization

Как можно прикрутить єтот софт к движку

m1hasik M
Аватара
m1hasik M
Возраст: 27
Репутация: 31
Сообщения: 200
Зарегистрирован: 12.11.2015
С нами: 3 года 6 месяцев
Откуда: Днепр
Skype

Сообщение #2 m1hasik » 16.02.2017, 08:15

andrij писал(а):Для поисковиков очень важен фактор скорости загрузки страници

Когда движок обрезает картинки товара то они очень не оптимизировани


jpegtran optimize JPEG images
optipng lossless PNG optimization
pngquant lossy PNG optimization

Как можно прикрутить єтот софт к движку

Точно не скажу, но часть того что вы написали это библиотеки хотсинга а не cms, так что врядли можно будет прикрутить это к сайту с одной стороны

P/S еще, в функции при ресайзе можно указать вот такой параметр
$thumb->setImageCompressionQuality(60);
это качество изображений, который нарезаются
100 - наилучшее
0 - наихудшее
по умолчанию на хостингах стоит примерно 80-95

therion.kiev
therion.kiev
Репутация: 2
Сообщения: 7
Зарегистрирован: 06.07.2016
С нами: 2 года 10 месяцев

Сообщение #3 therion.kiev » 03.03.2018, 08:10

Вопрос древний, как и решение. Оставлю здесь:
1) правим скрипт resize/resize.php

Код: Выделить всё

<?php

require_once('../api/Okay.php');

$filename = $_GET['file'];
$token = $_GET['token'];

$okay = new Okay();

/*Принимаем нужную сущность для ресаза её изображения*/
$original_img_dir = null;
$resized_img_dir = null;
if (isset($_GET['object']) && !empty($_GET['object'])) {
    //$_GET['object'] - по сути папка с нарезанными картинками
    if ($_GET['object'] == 'blog_resized') {
        $original_img_dir = $okay->config->original_blog_dir;
        $resized_img_dir = $okay->config->resized_blog_dir;
    }
    if ($_GET['object'] == 'brands_resized') {
        $original_img_dir = $okay->config->original_brands_dir;
        $resized_img_dir = $okay->config->resized_brands_dir;
    }
    if ($_GET['object'] == 'categories_resized') {
        $original_img_dir = $okay->config->original_categories_dir;
        $resized_img_dir = $okay->config->resized_categories_dir;
    }
    if ($_GET['object'] == 'deliveries_resized') {
        $original_img_dir = $okay->config->original_deliveries_dir;
        $resized_img_dir = $okay->config->resized_deliveries_dir;
    }
    if ($_GET['object'] == 'payments_resized') {
        $original_img_dir = $okay->config->original_payments_dir;
        $resized_img_dir = $okay->config->resized_payments_dir;
    }

}

$resized_filename =  $okay->image->resize($filename, $original_img_dir, $resized_img_dir);
if(is_readable($resized_filename)) {

    $mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));
   
   if ($mimeType == '   image/png') {
        header('Content-type: ' . $mimeType);
      $output = shell_exec("/home/therion/alva.kiev.ua/www/resize/optipng -o7 -strip all ".escapeshellarg($resized_filename));
        print file_get_contents($resized_filename);
   }
   
   if ($mimeType == 'image/jpeg') {
        header('Content-type: ' . $mimeType);
      $output = shell_exec("/home/therion/alva.kiev.ua/www/resize/jpegoptim --max=75 --strip-all --preserve --totals ".escapeshellarg($resized_filename));
        print file_get_contents($resized_filename);
   }

    header('Content-type: image');
    print file_get_contents($resized_filename);
}


2) в папку resize/ ложим бинарники jpegoptim и optipng (у меня на хостинге RHEL x64, скомпилил сам с исходников)
3) Готово

П.С: для RHEL x64 (Fedora,Centos) скачать бинарники можно тут: https://mega.nz/#!jIlERSJR!Qp3-jMOPmPsb2bd0CJDY9ywNcPHSVp7f2GoNO_mYhq4

NotSlow M
NotSlow M
Возраст: 37
Репутация: 1
Сообщения: 1
Зарегистрирован: 13.04.2018
С нами: 1 год 1 месяц
Откуда: Севастополь
Сайт

Сообщение #4 NotSlow » 13.04.2018, 12:49

therion.kiev, спасибо конечно что пытаетесь помочь.
Но без подробного описания это больше медвежья услуга... :)

Люди просто копипастят себе что-то из интернета, совершенно не понимая что происходит.

Как минимум стоило бы указать что путь /home/therion/alva.kiev.ua/www/ у каждого свой и стоит поправить, а не тупо передирать.

Плюс в чем сложность попросить хостера установить эти самые jpegoptim и optipng?
Это совершенно не проблема в большинстве случаев и ни к чему заливать свои бинарники, которые еще и далеко не у всех запустятся.

Вдобавок, возможно у вас отключены warning'и в php, но у кого-то может нет и логи будут изобиловать сообщениями типа "PHP Warning: Cannot modify header information".
А все потому что, смотрим что происходит:

Проверка есть ли доступ к фотке

Код: Выделить всё

if(is_readable($resized_filename)) {

И внутри этого условия:

Получаем mine тип файла.

Код: Выделить всё

$mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));

И дальше 2 раза сравниваем, а не png или jpeg ли у нас файлик часом.

Код: Выделить всё

if ($mimeType == '   image/png') {
if ($mimeType == 'image/jpeg') {

Сразу вопрос - почему у вас перед image/png 3 пробела?

Если совпадает с png или jpeg, то внутри соответствующего условия оно во-первых шлет заголовок header('Content-type: ' . $mimeType), а дальше прогоняет через optipng или jpegoptim.
Ладно, но зачем потом еще раз шлется заголовок header('Content-type: image') ?
И, жесть, еще раз print file_get_contents($resized_filename)
Это и вызывает предупреждение в логах из-за двойного заголовка. И главное - само содержание фотки передается в двух экземплярах друг за другом.
Браузеры конечно достаточно разумные чтоб показать правильно, но это же бред...

короче правильней так:

Код: Выделить всё

if(is_readable($resized_filename)) {

        $mimeType = image_type_to_mime_type(exif_imagetype($resized_filename));

        header('Content-type: ' . $mimeType);
        if ($mimeType == 'image/png') {
                $output = shell_exec("optipng -o7 -strip all ".escapeshellarg($resized_filename));
        }
        elseif ($mimeType == 'image/jpeg') {
                $output = shell_exec("jpegoptim --max=75 --strip-all --preserve --totals ".escapeshellarg($resized_filename));
        }
        print file_get_contents($resized_filename);
}

Обращаю внимание что остальную часть resize.php не трогаем.
Правим только то, что начинается с if(is_readable($resized_filename)) {

И обращаю внимание на:
shell_exec("optipng...
shell_exec("jpegoptim...
Если в логах будет ошибка что мол нет такого, то просим хостера поставить.
Ну или в крайнем случае все же пробуем закинуть свои бинарники и указываем тут полный правильный путь к ним.


Название раздела: Предложения по улучшению OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Предложения по улучшению OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость