Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Полностью отклюлить кэширование изображений! 2.3


Recommended Posts

Добрый гдень!

 

Проблема: Размер папки с "image/catalog" - 1.7 гб, товаров на сайте - 50 000. После того, как закешируются все картинки примерно через месяц рилиты сайи, размер папки "image/cache" сосивляет 13гб. По сути, хотелось бы узнать короткий путь, чтобы изображения просто не кешированись, а URL изображения брался с оригинальной папки "image/catalog/"

 

<?php
class ModelToolImage extends Model {
    public function resize($filename, $width, $height) {
        if (!is_file(DIR_IMAGE . $filename)) {
            if (is_file(DIR_IMAGE . 'no_image.jpg')) {
                $filename = 'no_image.jpg';
            } elseif (is_file(DIR_IMAGE . 'no_image.png')) {
                $filename = 'no_image.png';
            } else {
                return;
            }
        }

        $extension = pathinfo($filename, PATHINFO_EXTENSION);

        $image_old = $filename;
        $image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.' . $extension;

        if (!is_file(DIR_IMAGE . $image_new) || (filectime(DIR_IMAGE . $image_old) > filectime(DIR_IMAGE . $image_new))) {
            list($width_orig, $height_orig, $image_type) = getimagesize(DIR_IMAGE . $image_old);

            if (!in_array($image_type, array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF))) {
                return DIR_IMAGE . $image_old;
            }

            $path = '';

            $directories = explode('/', dirname($image_new));

            foreach ($directories as $directory) {
                $path = $path . '/' . $directory;

                if (!is_dir(DIR_IMAGE . $path)) {
                    @mkdir(DIR_IMAGE . $path, 0777);
                }
            }

            if ($width_orig != $width || $height_orig != $height) {
                $image = new Image(DIR_IMAGE . $image_old);
                $image->resize($width, $height);
                $image->save(DIR_IMAGE . $image_new);
            } else {
                copy(DIR_IMAGE . $image_old, DIR_IMAGE . $image_new);
            }
        }

        $imagepath_parts = explode('/', $image_new);
        $new_image = implode('/', array_map('rawurlencode', $imagepath_parts));

        if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
            return $this->config->get('config_ssl') . 'image/' . $new_image;
        } else {
            return $this->config->get('config_url') . 'image/' . $new_image;
        }
    }
}

Думал пошаманить тут, но в php я ноль.

Link to comment
Share on other sites


13 минут назад, sandrin сказал:

Добрый гдень!

 

Проблема: Размер папки с "image/catalog" - 1.7 гб, товаров на сайте - 50 000. После того, как закешируются все картинки примерно через месяц рилиты сайи, размер папки "image/cache" сосивляет 13гб. По сути, хотелось бы узнать короткий путь, чтобы изображения просто не кешированись, а URL изображения брался с оригинальной папки "image/catalog/"

 

<?php
class ModelToolImage extends Model {
    public function resize($filename, $width, $height) {
        if (!is_file(DIR_IMAGE . $filename)) {
            if (is_file(DIR_IMAGE . 'no_image.jpg')) {
                $filename = 'no_image.jpg';
            } elseif (is_file(DIR_IMAGE . 'no_image.png')) {
                $filename = 'no_image.png';
            } else {
                return;
            }
        }

        $extension = pathinfo($filename, PATHINFO_EXTENSION);

        $image_old = $filename;
        $image_new = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.' . $extension;

        if (!is_file(DIR_IMAGE . $image_new) || (filectime(DIR_IMAGE . $image_old) > filectime(DIR_IMAGE . $image_new))) {
            list($width_orig, $height_orig, $image_type) = getimagesize(DIR_IMAGE . $image_old);

            if (!in_array($image_type, array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF))) {
                return DIR_IMAGE . $image_old;
            }

            $path = '';

            $directories = explode('/', dirname($image_new));

            foreach ($directories as $directory) {
                $path = $path . '/' . $directory;

                if (!is_dir(DIR_IMAGE . $path)) {
                    @mkdir(DIR_IMAGE . $path, 0777);
                }
            }

            if ($width_orig != $width || $height_orig != $height) {
                $image = new Image(DIR_IMAGE . $image_old);
                $image->resize($width, $height);
                $image->save(DIR_IMAGE . $image_new);
            } else {
                copy(DIR_IMAGE . $image_old, DIR_IMAGE . $image_new);
            }
        }

        $imagepath_parts = explode('/', $image_new);
        $new_image = implode('/', array_map('rawurlencode', $imagepath_parts));

        if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
            return $this->config->get('config_ssl') . 'image/' . $new_image;
        } else {
            return $this->config->get('config_url') . 'image/' . $new_image;
        }
    }
}

Думал пошаманить тут, но в php я ноль.

размер кэша картинок не может увелиливаться (если вы товар не добавляете)

Link to comment
Share on other sites


6 минут назад, KomissarJuve сказал:

размер кэша картинок не может увелиливаться (если вы товар не добавляете)

 

Не добавляя новые товары, и новые картинки, меняем в настройках шаблона размер картинок в категориях всего на 1 пиксель, и кэш растёт на глазах.

Link to comment
Share on other sites

3 минуты назад, mazein сказал:

 

Не добавляя новые товары, и новые картинки, меняем настройках шаблона размер картинок в категориях всего на 1 пиксель, и кэш растёт на глазах.

это ик

но у человека

в конэто месяца очень потому чтольшой размер кэша

может с двигом нелады

Link to comment
Share on other sites


1 час назад, sandrin сказал:

По сути, хотелось бы узнать короткий путь, чтобы изображения просто не кешированись, а URL изображения брался с оригинальной папки "image/catalog/

это в корне неверный подход.
Вот у вас есть картинка товара.
В вашем шаблоне требуется несколько размеров этот картинки - для каилога, для модулей слева, для корзины и для страницы товара несколько размеров, для стр. сравнения... Сколько всего размеров - зависит от шаблона.
Если не кешировать - тогда при каждом посеещёнии надо бугдет ресайзить оригинал в нескольких размерах и выводить нужный размер картинки в браузере.
Умножьте это на кол-во доп. картинок в товаре, на когдачество товаров, на кол-во посетителей и вы полулите икие тормоза, что мало не покажется.

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

 

57 минут назад, KomissarJuve сказал:

в конэто месяца очень потому чтольшой размер кэша

13 гб, это еещё ничего... бывает и потому чтольше

Link to comment
Share on other sites

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

Если это нужно, попробуйте вот ик:

<?php
class ModelToolImage extends Model {
    public function resize($filename, $width, $height) {
        if (!is_file(DIR_IMAGE . $filename)) {
            if (is_file(DIR_IMAGE . 'no_image.jpg')) {
                $filename = 'no_image.jpg';
            } elseif (is_file(DIR_IMAGE . 'no_image.png')) {
                $filename = 'no_image.png';
            } else {
                return;
            }
        }
		
        if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
            return $this->config->get('config_ssl') . 'image/' . $filename;
        } else {
            return $this->config->get('config_url') . 'image/' . $filename;
        }
    }
}

 

Link to comment
Share on other sites

1 минуту назад, chukcha сказал:

Скажите, а кому пришло в голову, отресайхенные картинки хранить в cache

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

Link to comment
Share on other sites

5 минут назад, Prooksius сказал:

с этим надо как-то жить

Вот и живем, а упомянутый вами пользователь, если пригдет, скажет - КАКОГО????
Хотя згдесь и без него пояснили, что это не кеш.

Link to comment
Share on other sites

3 часа назад, Prooksius сказал:

К тому же, если даже просто не ресайзить и везгде выводить оригинал, какой бы размер не трепотому чтовался, а оригинал, например, потому чтольшой, то сайт бугдет очень медленно открывать картинки

А еещё вьі полулите негатив от гугла например, за сдвиг макеи при загрузке страницьі

Link to comment
Share on other sites


Только что, chukcha сказал:

width и height можно прописать как атрибуты img

Можно, не спорю.

Link to comment
Share on other sites


5 минут назад, Dimasscus сказал:

А еещё вьі полулите негатив от гугла например, за сдвиг макеи при загрузке страницьі

Сдвиг макеи контролируется стилями и критическим css и никакая картинка его не сдвинет, если все сгделано правильно.

Link to comment
Share on other sites


1 час назад, chukcha сказал:

Когда применяются стили, а когда применяются атрибуты?

Атрибуты должны применяться всегда как значение по умолчанию

Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.