Есть такая функция: PHP: public function browserСaching($pathToFile, $storageTime = 0) { header('Content-Type: '.mime_content_type($pathToFile)); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { header('HTTP/1.1 304 Not Modified'); header('Cache-control: public, max-age='.$storageTime); header('Expires: '.gmdate(DATE_RFC1123, time() + $storageTime)); }else{ header('Cache-control: max-age='.$storageTime); header('Expires: '.gmdate(DATE_RFC1123, time() + $storageTime)); header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($pathToFile))); readfile($pathToFile); } exit(); } Но вот независимо от того, какой установлен Cache-control или Expires браузер ни в какую не обновляет данные кеша. перед стартом сессии прописано: PHP: session_cache_limiter('nocache'); К примеру передал я в $storageTime 60 сек, меняю изображение, обновляю страницу через пару минут, а ничего в браузере не обновилось, кеш обновляется только при ctrl+f5, но по логике обновление кеша должно быть через минуту. Даже если закрыть браузер перезапустить всю систему, всё как оно - без изменений. Вот такие заголовки отдаются: Код (Text): HTTP/1.1 304 Not Modified Date: Fri, 20 Dec 2019 05:37:05 GMT Server: Apache Connection: Keep-Alive Keep-Alive: timeout=10, max=100 Expires: Fri, 20 Dec 2019 05:38:05 +0000 Cache-Control: public, max-age=60
Может кто подсказать, что не так делаю, возможно всё не так? Но при изменении файла, либо при истечении времени Expires, обновление кэша не происходит, всё время тянется одно и тоже по ка не сделаю принудительное обновление через ctrl+f5.
Для картинок эти заголовки могут вставляться независимо от php, nginx-ом, к примеру. Тогда надо добавить настройки nginx-а --- Добавлено --- Картинки, в принципе. не должны обычно доходить до php
Может я что-то не так понял, но в моей реализации все картинки отдаются через PHP. Т.е. если к примеру взять http://my_site.lic/image.jpg этот запрос будет обработан контроллером приложения и вернет это изображение с заголовками. Попробовал сделать так чтоб эти изображения повторно не дергались и если не были изменены то брать из кэша, но как-то всё казалось просто, но по факту что-то при изменении изображений или любых других валов всё равно всё тянется из кеша. --- Добавлено --- Пробовал разную реализацию кода, который в первом посте, но всё как-то безуспешно, правда если не писать PHP: header('Cache-control: public, max-age='.$storageTime); в IF то сначала улетает в кэш, а потом при обновлении снова дергается с сервера. но это из-за того что отсутствует заголовок PHP: header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($pathToFile))); в IF
В любом случае благодарю за ответ. Сейчас сделал так, что при первом входе всё берется с сервера, а при повторном из кэша, но если человек закрывает браузер, то при повторном входе все снова дергается из кэша. Т.е. работает как сессия.
Переменная $_SERVER['HTTP_IF_MODIFIED_SINCE'] точно существует (при поступлении соотв. заголовка)? Насколько я знаю, не все заголовки запроса доступны через $_SERVER. Я тебе ранее уже советовал. См., как поступает сервер, и по возможности в точности эмулируй его поведение. Если статик, отдаваемый непосредственно сервером, «не отваливается» при перезапуске браузера, тогда ты действительно что-то не учел. Иначе все норм. --- Добавлено --- Но, естественно, нужно найти/настроить клиент, который бы адекватно реагировал на твой код.
В принципе, то что хотел, сделал. Сейчас еще всё основное доделаю что хотел потестирую, как оно работает на живом трафике, и по логам посмотрю как и что.