Изучение языка очень хорошо и понимание его различных особенностей происходит из (многолетнего) опыта. Если вы хотите стать лучшим программистом, я бы сказал, понимая шаблоны проектирования, как и когда их использовать и / или даже когда вы их используете, не осознавая этого; техническая архитектура пользовательский опыт.
Знание языка (JavaScript) означает, что вы можете выбрать любой фреймворк и использовать его по своему желанию. Вам неизбежно придется погрузиться в исходный код, и если все, что вы знаете, это синтаксис фреймворка или 2 или 3, то вы не будете далеко ходить. Сказать, что получение исходного кода нескольких различных фреймворков, вероятно, является одним из лучших способов увидеть, как можно использовать JavaScript. Поработайте, просматривая код в Firebug или Web Inspector, а затем проверяя документацию JavaScript, особенно документы Mozilla и Webkit, чтобы получить дальнейшее понимание того, на что вы смотрите.
Понимая разницу между объектно-ориентированным и функциональным программированием, JavaScript - это привлекательное сочетание двух, а также того, когда и как использовать и то, и другое для создания потрясающей кодовой базы и потрясающих приложений, вы станете лучшим программистом JavaScript.
Простое чтение некоторых книг, особенно «хороших частей» Крокфорда, в которых он просто излагает свое мнение о том, что хорошо в JavaScript, пропуская при этом большую часть УДИВИТЕЛЬНЫХ частей JavaScript, может привести вас в замешательство.
Изучение кода, написанного кем-то вроде Томаса Фукса, с другой стороны, даст вам гораздо больше понимания возможности написания удивительного и эффективного JavaScript.
Попытка запомнить несколько ошибок или WTF также не очень поможет, вы поймете это, если начнете кодировать и проходить код библиотеки / фреймворков, особенно с комментариями, чтобы понять, почему они ' Мы использовали определенные свойства / значения, а не другие, почему и когда хорошо использовать определенные операнды и операторы, это все есть в коде, который используют люди фреймворка. Как лучше, чем учиться на примере? : ^)
Я считаю, что это должно быть
if (isset($headers['If-Modified-Since']) && (strtotime($headers['If-Modified-Since']) >= $file_time)) {
Проверка того, больше ли измененное время или равно, а не просто равно. Хотя я понимаю, что два значения должны быть одинаковыми.
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);
}
?>
После долгих поисков я нашел ответ. Браузер ничего не кэшировал (и не отправлял If-Modified-Since
), пока я не отправил следующий заголовок:
Cache-Control: private;
После этого все заработало.