В друпале есть удобный модуль ImageCache, который производит манипуляции над изображениями по заранее созданному набору правил (пресету). Благодаря ему, больше не нужно обрабатывать каждое изображение после загрузки его на сервер (они все хранятся в оригинальном виде), достаточно лишь при генерации страницы указать путь к картинке в виде:
/imagecache/preset-name/path/to/image.jpg
При первом запросе такой картинки, скрипт на основе файла path/to/image.jpg и набора правил preset-name создаст новое изображение и положит его в кэш. При последующих запросах, картинка будет отдаваться из кэша, минуя запуск скрипта и поднятия php.
Создать такой скрипт самостоятельно достаточно легко:
1. Создаём в корне сайта папку imagecache и даём ей права на запись.
2. Помещаем в неё файл .htaccess со следующим содержанием:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.+\.(jpe?g|gif|png))$ ../imagecache.php?preset=$1&file=$2 [NC]
После этого, все запросы на отсутствующие файлы в папке imagecache, будут проходить через скрипт imagecache.php.
В скрипте будут доступны две переменные: $_GET['preset'] — название пресета, $_GET['file'] — путь до файла который нужно обработать.
3. Создаём в корне сайта файл imagecache.php с кодом:
<?php
define('ROOT_DIR', dirname(__FILE__) . '/');
require_once(ROOT_DIR . 'includes/class.upload/class.upload.php');
$image = new upload(ROOT_DIR . $_GET['file']);
// пример пресета news-thumbs, который создаёт эскиз изображения размером 50x50
if ($_GET['preset'] == 'news-thumb')
{
$image->image_y = 50;
$image->image_x = 50;
$image->image_ratio_crop = true;
}
// пример пресета news, который создаёт изображения размером 250x250
else if ($_GET['preset'] == 'news')
{
$image->image_y = 250;
$image->image_x = 250;
$image->image_ratio = true;
$image->image_ratio_no_zoom_in = true;
}
// ... другие пресеты ...
else
{
die('error: no preset');
}
$filedir = dirname($_GET['file']);
$image->image_resize = true;
$image->auto_create_dir = true;
$image->file_safe_name = false;
$image->file_overwrite = true;
$image->process(ROOT_DIR . 'imagecache/' . $_GET['preset'] . '/' . ($filedir == '.' ? '' : $filedir));
if (!$image->processed)
{
die('error: ' . $image->error);
}
header('Location: ' . $_SERVER['REQUEST_URI']);
?>
Скрипт использует библиотеку class.upload.php для работы с изображениями.
4. Теперь если в html коде написать:
<img src="/imagecache/news-thumb/upload/123.jpg" alt="" />
то посетитель увидит картинку upload/123.jpg размером 50x50 пикселей.
Код нуждается в небольшой доработке — например нужно будет запретить вызывать скрипт напрямую из браузера, запретить обрабатывать изображения находящиеся в кэше, а так же выдавать правильные заголовки при ошибках, но основная идея думаю понятна.