До сих пор я не мог найти подобного решения в интернетах (хотя может просто плохо искал?) и придумал свое.
Что в результате?
В результате скрипт пережимает картинки до нужных размеров, в нужные форматы, накладывает копирайт (все то что делает самый обычный ресайзер картинок), но при этом не гадит на диск ни единым файлом, и не напрягает сервер постоянной повторной генерацией.
В чем фишка?
Все просто. надо просто отдать сгенерированную картинку с верными заголовками.
Мы же игнорируем факт того что файл не существует физически, что отдается он не nginx, и что заголовков в комплекте с файлом не идет.
Ближе к сути.
Отправляем заголовки до генерации картинки
header('Date: '.gmdate("D, d M Y H:i:s", time()).' GMT'); // текущее время сервера.
важный момент, служит для определения временного сдвига при сравнении браузером дат
$headers = getallheaders();
$since = isset($headers['If-Modified-Since']) ? strtotime($headers['If-Modified-Since']) : 0;
$filetime = filemtime($this->file);
забираем заголовок If-Modified-Since и сравниваем его со временем изменения оригинального файла-исходника на диске.
if($since >= $filetime ){ // сравниваем
header('HTTP/1.1 304 Not Modified');
header('Last-Modified: '.gmdate("D, d M Y H:i:s", $filetime).' GMT');
header('Expires: '.gmdate("D, d M Y H:i:s", (filemtime($this->file) +315360000)).' GMT');
header('content-disposition: inline; filename="unnamed.'.$this->replaceData['type'].'"');
header('Cache-control: cache, public, max-age=315360000');
header('Pragma: cache;');
exit;
// файл не изменился, отдаем заголовки, заканчиваем выполнение скрипта
}else{
header('Last-Modified: '.gmdate("D, d M Y H:i:s", $filetime).' GMT');
header('Expires: '.gmdate("D, d M Y H:i:s", (filemtime($this->file) +315360000)).' GMT');
header('content-disposition: inline; filename="unnamed.'.$this->replaceData['type'].'"');
header('Cache-control: cache, public, max-age=315360000');
header('Pragma: cache;');
// файл еще не кеширован, или кеш старее последнего изменения исходного файла. Отдаем стандартные заголовки (важно: не лепим отсебятины, делаем так как сделал бы сервер отдавая статику) браузер их запоминает, и на их основе далее будет кешировать файл.
}
Описал коротко, только самое важное, пара часов до работы, так что, тороплюсь, немного подробнее описал тут http://blog.smartoff.net/blog/16/
Спасибо за внимание