Ребята подскажите как отключить только cache картинок т.е. disable image cache OcStore 1.5.5.1.2 Полностью, вообще и навсегда. Ну или задать папку из которой фото не будут кэшироваться Это вариант конечно лучше Ожидаемая нагрузка макс 50 посетителей в день.
странно конечно. зачем? там не столько кеширование идет, сколько ресайз. catalog/model/tool/image.php смотря через что у тебя ресайз и поставь так что б функция возвращала старую картинку а не ресайзила. или тебе нужно что б именно браузер не кешировал их и каждый раз загружал с сервера? тогда поищи как задать в htaccess что то типа <IfModule mod_headers.c> # Cache Media Files <FilesMatch"\.(jpg|jpeg|png|gif)$"> Header set Cache-Control "no-cache" Header set Expires "Mon, 20 Apr 201020:00:00 GMT" Header unset Last-Modified </FilesMatch> </IfModule> это так, пример на скорую руку и не факт что правильный и рабочий короче вот тут смотри http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html#no-cache
Меня интересует больше первый вариант, а точнее картинки категорий, т.к. после кэширования и ресайза выглядят хер***ко даже если изначально делать именно в том размере который нужен а качество выставить на 100, все равно идет потеря четкости (резкости) в изображениях Насколько я понял, за все это отвечают три файла image.php /system/library/image.php Код: <?php class Image { private $file; private $image; private $info; public function __construct($file) { if (file_exists($file)) { $this->file = $file; $info = getimagesize($file); $this->info = array( 'width' => $info[0], 'height' => $info[1], 'bits' => $info['bits'], 'mime' => $info['mime'] ); $this->image = $this->create($file); } else { exit('Error: Could not load image ' . $file . '!'); } } private function create($image) { $mime = $this->info['mime']; if ($mime == 'image/gif') { return imagecreatefromgif($image); } elseif ($mime == 'image/png') { return imagecreatefrompng($image); } elseif ($mime == 'image/jpeg') { return imagecreatefromjpeg($image); } } public function save($file, $quality = 100) { $info = pathinfo($file); $extension = strtolower($info['extension']); if (is_resource($this->image)) { if ($extension == 'jpeg' || $extension == 'jpg') { imagejpeg($this->image, $file, $quality); } elseif($extension == 'png') { imagepng($this->image, $file); } elseif($extension == 'gif') { imagegif($this->image, $file); } imagedestroy($this->image); } } /** * * @param width * @param height * @param default char [default, w, h] * default = scale with white space, * w = fill according to width, * h = fill according to height * */ public function resize($width = 0, $height = 0, $default = '') { if (!$this->info['width'] || !$this->info['height']) { return; } $xpos = 0; $ypos = 0; $scale = 1; $scale_w = $width / $this->info['width']; $scale_h = $height / $this->info['height']; if ($default == 'w') { $scale = $scale_w; } elseif ($default == 'h'){ $scale = $scale_h; } else { $scale = min($scale_w, $scale_h); } if ($scale == 1 && $scale_h == $scale_w && $this->info['mime'] != 'image/png') { return; } $new_width = (int)($this->info['width'] * $scale); $new_height = (int)($this->info['height'] * $scale); $xpos = (int)(($width - $new_width) / 2); $ypos = (int)(($height - $new_height) / 2); $image_old = $this->image; $this->image = imagecreatetruecolor($width, $height); if (isset($this->info['mime']) && $this->info['mime'] == 'image/png') { imagealphablending($this->image, false); imagesavealpha($this->image, true); $background = imagecolorallocatealpha($this->image, 255, 255, 255, 127); imagecolortransparent($this->image, $background); } else { $background = imagecolorallocate($this->image, 255, 255, 255); } imagefilledrectangle($this->image, 0, 0, $width, $height, $background); imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->info['width'], $this->info['height']); imagedestroy($image_old); $this->info['width'] = $width; $this->info['height'] = $height; } public function watermark($file, $position = 'bottomright') { $watermark = $this->create($file); $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark); switch($position) { case 'topleft': $watermark_pos_x = 0; $watermark_pos_y = 0; break; case 'topright': $watermark_pos_x = $this->info['width'] - $watermark_width; $watermark_pos_y = 0; break; case 'bottomleft': $watermark_pos_x = 0; $watermark_pos_y = $this->info['height'] - $watermark_height; break; case 'bottomright': $watermark_pos_x = $this->info['width'] - $watermark_width; $watermark_pos_y = $this->info['height'] - $watermark_height; break; } imagecopy($this->image, $watermark, $watermark_pos_x, $watermark_pos_y, 0, 0, 120, 40); imagedestroy($watermark); } public function crop($top_x, $top_y, $bottom_x, $bottom_y) { $image_old = $this->image; $this->image = imagecreatetruecolor($bottom_x - $top_x, $bottom_y - $top_y); imagecopy($this->image, $image_old, 0, 0, $top_x, $top_y, $this->info['width'], $this->info['height']); imagedestroy($image_old); $this->info['width'] = $bottom_x - $top_x; $this->info['height'] = $bottom_y - $top_y; } public function rotate($degree, $color = 'FFFFFF') { $rgb = $this->html2rgb($color); $this->image = imagerotate($this->image, $degree, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2])); $this->info['width'] = imagesx($this->image); $this->info['height'] = imagesy($this->image); } private function filter($filter) { imagefilter($this->image, $filter); } private function text($text, $x = 0, $y = 0, $size = 5, $color = '000000') { $rgb = $this->html2rgb($color); imagestring($this->image, $size, $x, $y, $text, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2])); } private function merge($file, $x = 0, $y = 0, $opacity = 100) { $merge = $this->create($file); $merge_width = imagesx($image); $merge_height = imagesy($image); imagecopymerge($this->image, $merge, $x, $y, 0, 0, $merge_width, $merge_height, $opacity); } private function html2rgb($color) { if ($color[0] == '#') { $color = substr($color, 1); } if (strlen($color) == 6) { list($r, $g, $b) = array($color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5]); } elseif (strlen($color) == 3) { list($r, $g, $b) = array($color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2]); } else { return false; } $r = hexdec($r); $g = hexdec($g); $b = hexdec($b); return array($r, $g, $b); } } ?> /catalog/model/tool/image.php Код: <?php class ModelToolImage extends Model { /** * * @param filename string * @param width * @param height * @param type char [default, w, h] * default = scale with white space, * w = fill according to width, * h = fill according to height * */ public function resize($filename, $width, $height, $type = "") { if (!file_exists(DIR_IMAGE . $filename) || !is_file(DIR_IMAGE . $filename)) { return; } $info = pathinfo($filename); $extension = $info['extension']; $old_image = $filename; $new_image = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . $width . 'x' . $height . $type .'.' . $extension; if (!file_exists(DIR_IMAGE . $new_image) || (filemtime(DIR_IMAGE . $old_image) > filemtime(DIR_IMAGE . $new_image))) { $path = ''; $directories = explode('/', dirname(str_replace('../', '', $new_image))); foreach ($directories as $directory) { $path = $path . '/' . $directory; if (!file_exists(DIR_IMAGE . $path)) { @mkdir(DIR_IMAGE . $path, 0777); } } list($width_orig, $height_orig) = getimagesize(DIR_IMAGE . $old_image); if ($width_orig != $width || $height_orig != $height) { $image = new Image(DIR_IMAGE . $old_image); $image->resize($width, $height, $type); $image->save(DIR_IMAGE . $new_image); } else { copy(DIR_IMAGE . $old_image, DIR_IMAGE . $new_image); } } return $this->getImageUrl($new_image); } protected function getImageUrl($new_image) { $parts = explode('/', $new_image); $new_url = implode('/', array_map('rawurlencode', $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_url; } else { return $this->config->get('config_url') . 'image/' . $new_url; } } } ну и /admin/model/tool/image.php Код: <?php class ModelToolImage extends Model { public function resize($filename, $width, $height) { if (!file_exists(DIR_IMAGE . $filename) || !is_file(DIR_IMAGE . $filename)) { return; } $info = pathinfo($filename); $extension = $info['extension']; $old_image = $filename; $new_image = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . $width . 'x' . $height . '.' . $extension; if (!file_exists(DIR_IMAGE . $new_image) || (filemtime(DIR_IMAGE . $old_image) > filemtime(DIR_IMAGE . $new_image))) { $path = ''; $directories = explode('/', dirname(str_replace('../', '', $new_image))); foreach ($directories as $directory) { $path = $path . '/' . $directory; if (!file_exists(DIR_IMAGE . $path)) { @mkdir(DIR_IMAGE . $path, 0777); } } $image = new Image(DIR_IMAGE . $old_image); $image->resize($width, $height); $image->save(DIR_IMAGE . $new_image); } if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) { return HTTPS_CATALOG . 'image/' . $new_image; } else { return HTTP_CATALOG . 'image/' . $new_image; } } } ?> Задача упрощается если принять решение, что картинки которые должны остаться НЕ тронутыми должны быть в формате .png т.е. JPG очень распространенный формат и его сжатие и обработка имеют право на существование, а вынести все важные картинки в отдельный тип файлов кажется более логичным и простым, к тому же PNG поддерживает прозрачность. Вопрос, как не только заставить движок не сжимать картинки PNG но и не делать на них ресайз в 3-м image.php
catalog/model/tool/image.php $extension = $info['extension']; добавить ++ if ($extension == 'png' || $extension == ...) { ++ return $old_image; ++ } как то так, нету движка щас свободно поэксперементировать в первой строке перебираем расширения, если подходят то возвращаем старую картинку, возможно стоить возвращать return $this->getImageUrl($old_image);
Ну что же, время прошло проблема осталась и дерзаем с новыми силами. Нашел пару новых идей на просторах инета. Где-то предлагали заменить resize на resample это просто, но есть и другая идея - прогнать это чудо через фильтр sharpen, код ниже Код: { $matrix = array( array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1), ); $divisor = array_sum(array_map('array_sum', $matrix)); $offset = 0; imageconvolution($image, $matrix, $divisor, $offset); return $image; } Ну и собственно вопрос знатокам - В какой именно файл image.php нужно вставить вышеуказанный код и между каких строк?
простой, но мощный отключить кэш (system\library\cache.php) Код: public function get($key) { //$files = glob(DIR_CACHE . 'cache.' . $key . '.*'); //if ($files) { // $cache = file_get_contents($files[0]); // return unserialize($cache); //} } public function set($key, $value) { //$this->delete($key); //$file = DIR_CACHE . 'cache.' . $key . '.' . (time() + $this->expire); //$handle = fopen($file, 'w'); //fwrite($handle, serialize($value)); //fclose($handle); }
Есть в system/library/image.php метод resize в конце метода imagecopyresampled($this->image,.... $this->image - нужный ресурс Код: $matrix = array( array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1), ); $divisor = array_sum(array_map('array_sum', $matrix)); $offset = 0; imageconvolution($this->image, $matrix, $divisor, $offset);
Была такая идея , но по причине завязки кэшированных изображений в работе других функций была отсеяна. Но я могу быть не прав по этому поводу, наверное точно прописывается и/или изменяется в модуле выгрузки. Насколько я понял при выгрузке товаров в яндекс.маркет выгружаются именно кэшированные изображения. Что имеет право на существование, особенно в случае если используется наложение водяного знака или тп. Спасибо буду пробовать