Почему браузеры не кэшируют файлы, выводимые PHP readfile ()? - PullRequest
0 голосов
/ 22 мая 2018

В настоящее время я выводлю некоторые файлы изображений через PHP readfile (), используя следующий код, но через Firefox и инструменты разработчика Chrome я замечаю, что ни один из этих файлов не кэшируется.

ob_start();
outputfile($fp);

function outputfile( $fp ) {

  header("Content-Type: $mime_type");
  header("Content-Length: " . filesize($fp));
  header("Cache-Control: public, max-age=3600");
  header("Etag: " . md5_file($fp));
  $date = gmdate("D, j M Y H:i:s", filemtime($fp))." GMT";
  header("Last-Modified: $date");

  readfile($fp);
  exit; // tried ob_end_flush() too before exiting

}

Код выводитфайл со следующими заголовками в инструментах разработчика ...

Cache-Control: public, max-age=2678400
Connection: keep-alive
Content-Length: 155576
Content-Type: image/jpeg
Date: Mon, 21 May 2018 22:31:02 GMT
Last-Modified: Sat, 03 Mar 2018 19:34:05 GMT
Etag: 507f2520385c009a7385a1165032bd61
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Server: nginx

Если я возвращаю элемент управления Nginx для обслуживания файла, он выводит следующие заголовки:

Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 155576
Content-Type: image/jpeg
Date: Mon, 21 May 2018 22:31:02 GMT
ETag: "5a9af8ad-4a5b"
Last-Modified: Sat, 03 Mar 2018 19:34:05 GMT
Server: nginx

Я что-то упускаю из-за того, что браузеры не кэшируют файлы изображений?

Я попытался добавить все необходимые заголовки Cache-Control, такие как eTag и max-age, но браузеры просто отказываются кэшировать данные,Я даже попытался скопировать все заголовки из вывода сервера и использовать "ob_start ('ob_gzhandler');"на случай, если исходные данные файла не были сжаты.

Браузеры просто не будут кэшировать любые данные файла, отправленные через PHP.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Мне кажется, я нашел проблему ...

Интересно, может ли какой-либо код, связанный с cookie, повлиять на readfile (), и обнаружил, что, если бы у меня была session_start () перед использованием функции, браузеры отказались быкэшировать данные файла, отправленные.Если я удаляю session_start (), кеширование браузера работает должным образом с учетом отправленных заголовков Cache-Control.

Я не совсем понимаю, почему это так, так как я сравнил вывод readfile () с и без session_start() перед ним и вывод кажется одинаковым.

Для записи я использую PHP 5.5.

0 голосов
/ 22 мая 2018

Expires: Thu, 19 Nov 1981 08:52:00 GMT может быть причиной.Технически, если заголовок Cache-Control имеет директиву max-age, Expires следует игнорировать (Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires). Однако стоит проверить, удалив этот заголовок.

Ваш PHP-код не являетсянастройка, так что я предполагаю, что это происходит из некоторого общего конфига / кода, который выполняется при каждом исходящем ответе. Вы поместили это в свой конфиг Nginx для всех запросов PHP?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...