За последние 24 часа нас посетили 22879 программистов и 1272 робота. Сейчас ищут 808 программистов ...

Браузерное кеширование.

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 20 дек 2019.

  1. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Есть такая функция:

    PHP:
    1.     public function browserСaching($pathToFile, $storageTime = 0)
    2.     {
    3.  
    4.         header('Content-Type: '.mime_content_type($pathToFile));
    5.  
    6.         if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    7.  
    8.             header('HTTP/1.1 304 Not Modified');
    9.             header('Cache-control: public, max-age='.$storageTime);
    10.             header('Expires: '.gmdate(DATE_RFC1123, time() + $storageTime));
    11.  
    12.         }else{
    13.  
    14.             header('Cache-control: max-age='.$storageTime);
    15.             header('Expires: '.gmdate(DATE_RFC1123, time() + $storageTime));
    16.             header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($pathToFile)));
    17.             readfile($pathToFile);
    18.         }
    19.         exit();
    20.      
    21.     }
    Но вот независимо от того, какой установлен Cache-control или Expires браузер ни в какую не обновляет данные кеша.

    перед стартом сессии прописано:
    PHP:
    К примеру передал я в $storageTime 60 сек, меняю изображение, обновляю страницу через пару минут, а ничего в браузере не обновилось, кеш обновляется только при ctrl+f5, но по логике обновление кеша должно быть через минуту.
    Даже если закрыть браузер перезапустить всю систему, всё как оно - без изменений.

    Вот такие заголовки отдаются:

    Код (Text):
    1. HTTP/1.1 304 Not Modified
    2. Date: Fri, 20 Dec 2019 05:37:05 GMT
    3. Server: Apache
    4. Connection: Keep-Alive
    5. Keep-Alive: timeout=10, max=100
    6. Expires: Fri, 20 Dec 2019 05:38:05 +0000
    7. Cache-Control: public, max-age=60
     
  2. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Может кто подсказать, что не так делаю, возможно всё не так?
    Но при изменении файла, либо при истечении времени Expires, обновление кэша не происходит, всё время тянется одно и тоже по ка не сделаю принудительное обновление через ctrl+f5.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Для картинок эти заголовки могут вставляться независимо от php, nginx-ом, к примеру. Тогда надо добавить настройки nginx-а
    --- Добавлено ---
    Картинки, в принципе. не должны обычно доходить до php
     
    AlexandrS нравится это.
  4. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Может я что-то не так понял, но в моей реализации все картинки отдаются через PHP.
    Т.е. если к примеру взять http://my_site.lic/image.jpg этот запрос будет обработан контроллером приложения и вернет это изображение с заголовками.
    Попробовал сделать так чтоб эти изображения повторно не дергались и если не были изменены то брать из кэша, но как-то всё казалось просто, но по факту что-то при изменении изображений или любых других валов всё равно всё тянется из кеша.
    --- Добавлено ---
    Пробовал разную реализацию кода, который в первом посте, но всё как-то безуспешно, правда если не писать
    PHP:
    1. header('Cache-control: public, max-age='.$storageTime);
    в IF то сначала улетает в кэш, а потом при обновлении снова дергается с сервера.
    но это из-за того что отсутствует заголовок
    PHP:
    1. header('Last-Modified: '.gmdate(DATE_RFC1123, filemtime($pathToFile)));
    в IF
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Это я вас неправильно понял. Тогда так сразу не могу помочь
     
    AlexandrS нравится это.
  6. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    В любом случае благодарю за ответ.
    Сейчас сделал так, что при первом входе всё берется с сервера, а при повторном из кэша, но если человек закрывает браузер, то при повторном входе все снова дергается из кэша. Т.е. работает как сессия.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Переменная $_SERVER['HTTP_IF_MODIFIED_SINCE'] точно существует (при поступлении соотв. заголовка)? Насколько я знаю, не все заголовки запроса доступны через $_SERVER.

    Я тебе ранее уже советовал. См., как поступает сервер, и по возможности в точности эмулируй его поведение. Если статик, отдаваемый непосредственно сервером, «не отваливается» при перезапуске браузера, тогда ты действительно что-то не учел. Иначе все норм.
    --- Добавлено ---
    Но, естественно, нужно найти/настроить клиент, который бы адекватно реагировал на твой код.
     
    AlexandrS нравится это.
  8. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    В принципе, то что хотел, сделал. Сейчас еще всё основное доделаю что хотел потестирую, как оно работает на живом трафике, и по логам посмотрю как и что.