PHP

Кэширование картинок на PHP

На днях я написал небольшой скрипт, позволяющий кешировать картинки. Собственно, и делюсь со всеми моими читателями :)

Кеширование — накопление данных в доступном хранилище, с целью их быстрого извлечения по мере надобности. Конкретно для нашего случая — это создание картинок в заданном размере при запросе пользователя, сохранение в папке caсhe и вывод их на экран.

Создаем файл в корневой директории pic.php и вставляем в него следующий код:
<?php

function createthumbnail($filetype, $origfile, $thumbfile, $new_w, $new_h, $par)
{
	if ($filetype == 1) { $origimage = imagecreatefromgif($origfile); }
	elseif ($filetype == 2) { $origimage = imagecreatefromjpeg($origfile); }
	elseif ($filetype == 3) { $origimage = imagecreatefrompng($origfile); }

	$old_x = imagesx($origimage);
	$old_y = imagesy($origimage);

	if ($old_x > $new_w || $old_y > $new_h) {
		if (($old_x < $old_y) && $par == "n") {
			$thumb_w = round(($old_x * $new_h) / $old_y);
			$thumb_h = $new_h;
		} elseif (($old_x > $old_y) && $par == "n") {
			$thumb_w = $new_w;
			$thumb_h = round(($old_y * $new_w) / $old_x);
		} elseif (($old_x < $old_y) && $par == "s") {
			$thumb_w = $new_w;
			$thumb_h = round(($old_y * $new_w) / $old_x);
		} elseif (($old_x > $old_y) && $par == "s") {
			$thumb_w = $new_w;
			$thumb_h = round(($old_y * $new_w) / $old_x);
		} else {
			$thumb_w = $new_w;
			$thumb_h = $new_h;
		}
	} else {
		$thumb_w = $old_x;
		$thumb_h = $old_y;
	}

	$thumbimage = imagecreatetruecolor($thumb_w,$thumb_h);
	$result = imagecopyresampled($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);

	touch($thumbfile);

	if ($filetype == 1) { imagegif($thumbimage, $thumbfile); }
	elseif ($filetype == 2) { imagejpeg($thumbimage, $thumbfile); }
	elseif ($filetype == 3) { imagepng($thumbimage, $thumbfile); }
}

if (isset($_GET['url']) && $_GET['url'] != "" && isset($_GET['w']) && $_GET['w'] != "" && isset($_GET['p']) && ($_GET['p'] == "n" || $_GET['p'] == "s")) {
	$url = $_GET['url'];
	$width = $_GET['w'];
	$height = (isset($_GET['h']) ? $_GET['h'] : '500');
	$par = $_GET['p'];

	$pic_types = array(".gif",".jpg",".jpeg",".png");
	$pic = basename($url);
	$pic_name = explode(".", $pic);
	$pic_ext = strtolower(strrchr($pic,"."));
	if (!in_array($pic_ext, $pic_types)) {
		exit();
	} else {
		$imagefile = getimagesize($url);
		$thumb = "cache/".$pic_name[0]."_".$width.$par.$pic_ext;
		if (!file_exists($thumb) || filesize($thumb) == 0) {
			createthumbnail($imagefile[2], $url, $thumb, $width, $height, $par);
		}
	}
	header("Location: ".$thumb);
}

?>

Не забываем создать папку cache так же в корневой директории.

Ну а сейчас разберемся как это все работает на конкретном примере.

Допустим у нас есть картинка kartinka.jpg лежащая в папке images. Скрипт приведенный выше может кешировать картинки в 2 разных ситуациях.

Первая ситуация заключается в том, когда нам надо уменьшить картинку только по ширине, т. е. ширина фиксируется, а высота подгоняется, сохраняя пропорции. В этом случае путь до картинки имеет вид:
<img src="pic.php?url=images/kartinka.jpg&w=100&p=s">

где url=images/kartinka.jpg — путь до оригинальной киртинки, w=100 — ширина создаваемой картинки, а p=s — показатель того, что высоту картинки нужно подогнать по пропорциям исходя из ширины.

Второй случай — это когда нужно вместить картинку в заданную область с сохранением пропорций. Тогда код имеет следующий вид:
<img src="pic.php?url=images/kartinka.jpg&w=100&h=100&p=n">

где url=images/kartinka.jpg — путь до оригинальной киртинки, w=100 — ширина создаваемой картинки, h=100 — высота создаваемой картинки, а p=n — показатель того, что картинку нужно уместить в заданную область, сохраняя пропорции.


Для чего нужно кеширование? А нужно оно, например, для того чтобы экономить место на сайте, ведь все файлы из папки cache можно удалить в любое время. Они будут созданы занова при запросе пользователя. Или, например, если вы меняете структуру или дизайн сайта и нужно чтобы превью картинок оригинального размера были не 100 пикселей в ширину а, например, 150, то для этого достаточно изменить показатель w и все будет хорошо :)

P. S. Скрипт работает на библиотеке изображений GD2.
Добавлено: 23 Августа 2013 01:58:55 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...