Кэширование изображения запрашивает через PHP - If-Modified-Since, не отправляемый

Изучение языка очень хорошо и понимание его различных особенностей происходит из (многолетнего) опыта. Если вы хотите стать лучшим программистом, я бы сказал, понимая шаблоны проектирования, как и когда их использовать и / или даже когда вы их используете, не осознавая этого; техническая архитектура пользовательский опыт.

Знание языка (JavaScript) означает, что вы можете выбрать любой фреймворк и использовать его по своему желанию. Вам неизбежно придется погрузиться в исходный код, и если все, что вы знаете, это синтаксис фреймворка или 2 или 3, то вы не будете далеко ходить. Сказать, что получение исходного кода нескольких различных фреймворков, вероятно, является одним из лучших способов увидеть, как можно использовать JavaScript. Поработайте, просматривая код в Firebug или Web Inspector, а затем проверяя документацию JavaScript, особенно документы Mozilla и Webkit, чтобы получить дальнейшее понимание того, на что вы смотрите.

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

Простое чтение некоторых книг, особенно «хороших частей» Крокфорда, в которых он просто излагает свое мнение о том, что хорошо в JavaScript, пропуская при этом большую часть УДИВИТЕЛЬНЫХ частей JavaScript, может привести вас в замешательство.

Изучение кода, написанного кем-то вроде Томаса Фукса, с другой стороны, даст вам гораздо больше понимания возможности написания удивительного и эффективного JavaScript.

Попытка запомнить несколько ошибок или WTF также не очень поможет, вы поймете это, если начнете кодировать и проходить код библиотеки / фреймворков, особенно с комментариями, чтобы понять, почему они ' Мы использовали определенные свойства / значения, а не другие, почему и когда хорошо использовать определенные операнды и операторы, это все есть в коде, который используют люди фреймворка. Как лучше, чем учиться на примере? : ^)

5
задан Cyril Gandon 28 July 2011 в 08:34
поделиться

3 ответа

Я считаю, что это должно быть

if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) >= $file_time)) {

Проверка того, больше ли измененное время или равно, а не просто равно. Хотя я понимаю, что два значения должны быть одинаковыми.

2
ответ дан 14 December 2019 в 01:14
поделиться

mandor at mandor dot net опубликовал решение в документации PHP.net для функции заголовка, которая работала для меня:

<?php

        // Test image.
        $fn = '/test/foo.png';

        // Getting headers sent by the client.
        $headers = apache_request_headers();

        // Checking if the client is validating his cache and if it is current.
        if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) == filemtime($fn))) {
            // Client's cache IS current, so we just respond '304 Not Modified'.
            header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 304);
        } else {
            // Image not cached or cache outdated, we respond '200 OK' and output the image.
            header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($fn)).' GMT', true, 200);
            header('Content-Length: '.filesize($fn));
            header('Content-Type: image/png');
            print file_get_contents($fn);
        }

    ?>
5
ответ дан 14 December 2019 в 01:14
поделиться

После долгих поисков я нашел ответ. Браузер ничего не кэшировал (и не отправлял If-Modified-Since ), пока я не отправил следующий заголовок:

Cache-Control: private;

После этого все заработало.

1
ответ дан 14 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: