Изменение размера картинок на лету с кешированием

Статус
В этой теме нельзя размещать новые ответы.

Mapkyc

Профессор
Регистрация
8 Май 2007
Сообщения
107
Реакции
47
На сайте в разных местах необходимо выводить разные размеры одной картинки.

Сейчас это решается установкой width="" в качестве параметра тега.

Хотелось бы иметь такой php скрипт, которому давали параметром имя оригинала и размеры, а он проверял, если есть кеш, то отдавал бы его, если не было уменьшал бы картинку, кешировал в файл, и отдавал браузеру.
 
а в чем вопрос? GD в помощь. И еще полезено будет озаботиться кешированием на уровне браузера.
 
Спасибо конечно=) Я наверно невнятно высказался выше. :D

Кеширование на уровне браузера не интересно.
Дело в том что мой сайт посещают около двух тысяч человеков в день. Мой хостер и так порой жалуется, что много ресурсов кушаю. Приходится постоянно повышать тариф. Ресайз картинок занимает немало процессорного времени, особенно когда их на странице много - это новостной портал.

Нужен скрипт такого типа
Обращаемся resize.php?img=uploads/image.jpg&w=300
Скрипт проверяет есть ли уже в директории с кешем(ну скажем в директории imgcache уменьшенная версия такой картинки, в идеале, смотрит дату создания, не превышает ли она установленный в скрипте параметром кеш-лимит) если есть - отдает из кеша - нет генерит умешьшенную копию и сохраняет в кеш
 
  • Заблокирован
  • #4
Вот функция ресайза:
PHP:
function imageresize(&$img, $width, $height) {
	$w = imagesx($img);
	$h = imagesy($img);
	$ratio = 0;
	if($width && $height) {
		$w_dest = $width;
		$h_dest = $height;
	} else {
		if($width > 0)
			$ratio = $w / $width;
		elseif($height > 0)
			$ratio = $h / $height;
		if($ratio > 0) {
			$w_dest = round($w / $ratio);
			$h_dest = round($h / $ratio);
		}
	}
	if(!$w_dest || !$h_dest)
		return false;
	$new_img = imagecreatetruecolor($w_dest, $h_dest);
	imagealphablending($new_img, false);
	imagesavealpha($new_img, true);
	imagefilledrectangle($new_img, 0, 0, $w_dest, $h_dest, imagecolorallocatealpha($new_img, 255, 255, 255, 127));
	imagecopyresampled($new_img, $img, 0, 0, 0, 0, $w_dest, $h_dest, $w, $h); 
	 $img = $new_img;
}
А в чём проблема кэширования? Просто сканируете папку scandir() и смотрите - есть или нет изображения - если есть - отдаёте, если нет - ресайз+сохранение.

А вообще атрибут width был наверно более правильным решением.

$img - это ваш созданный в php имг.
$width - нужная ширина
$height - высота
Из ширины или высоты нужно указывать что-то одно. Функция пропорционально уменьшит изображение.
 
аа. то есть уже готовый скрипт нужен?) понял.

насчет кеширования на уровне браузера. Обычные картинки кешируются без особого труда, а вот через php запрос кеширование может не работать, поэтому желательно доработать, чтоб опять же меньше платить хостеру)
 
  • Заблокирован
  • #6
аа. то есть уже готовый скрипт нужен?) понял.
насчет кеширования на уровне браузера. Обычные картинки кешируются без особого труда, а вот через php запрос кеширование может не работать, поэтому желательно доработать, чтоб опять же меньше платить хостеру)
Какая разница запрос или нет?
Как я понял кеширование в данном случае - это просто сохранение изменённого изображения.
 
Сейчас я думаю решать задачу так, возьму скрипт уменьшения картинки с сохранением в файл. буду сохранять в директорию, откуда на сайте будет запрашиваться картинка, под с помощью mod_rewrite создам правило, что если файл в директории отсутствует - переписывать урл на скрипт, передавая ему определенные параметры.

Но это не то решение, какое хотелось бы. Хотелось бы так как я написал во втором посте.

McLay, я конечно извиняюсь, но не тупи!
Причем тут кеширование в браузере. Речь идет о кешировании на сервере уменьшенной копии, дабы скрипт ее заново не генерил.
 
кеширование в браузере в дополнение к серверному

Добавлено через 2 минуты
Какая разница запрос или нет?
Как я понял кеширование в данном случае - это просто сохранение изменённого изображения.
большая. Как правило серверы настроены так, что в заголовках просят кешировать все каринки, но не php скрипты
 
  • Заблокирован
  • #9
Вот зачем вам мод_реврайт??
В функции, которую я привёл - есть всё, что вам нужно, кроме кеширование.
А уж записать в файл и делать проверку, я думаю, вы сами сможете.

Добавлено через 3 минуты
McLay, вы просто не поняли, что нужно сделать.
 
Добавлено через 3 минуты
McLay, вы просто не поняли, что нужно сделать.
прекрасно понял. я же говорю в дополнение.
кстати мод_реврайт замечательно решение. Потому как, иначе придется постоянно дергать пхп скрипт и передавать через него килобайты картинок, что тоже не очень хорошо скажется на ресурсах)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху