Просмотр поста

.
ramzes
Речь пойдет о кешировании (логично), но не на стороне сервера, а на стороне клиента.
До сих пор я не мог найти подобного решения в интернетах (хотя может просто плохо искал?) и придумал свое.
Что в результате?
В результате скрипт пережимает картинки до нужных размеров, в нужные форматы, накладывает копирайт (все то что делает самый обычный ресайзер картинок), но при этом не гадит на диск ни единым файлом, и не напрягает сервер постоянной повторной генерацией.
В чем фишка?
Все просто. надо просто отдать сгенерированную картинку с верными заголовками.
Мы же игнорируем факт того что файл не существует физически, что отдается он не 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/
Спасибо за внимание