@nikitahudkov

Очистка кэша php?

Пишу сайт. Хочу чтобы при его посещении кэш очищался и все изменения в css, страницах сразу менялись на новые и юзеру не приходилось чистить кэш вручную. Как это реализовать на php, есть какая-либо функция?
  • Вопрос задан
  • 1331 просмотр
Решения вопроса 1
php666
@php666
PHP-макака
Примерно так:
Запрос вида /css/style.css
обрабатывается неким контроллером, назовём его контроллер CSS.
Т.е. если с сервера запрашивается адрес /css/style.css, на самом деле вызывается php скрипт, в который передаётся аргумент, строка "style.css" (гугли mod_rewrite или единая точка входа).

Далее, в контроллере CSS ты смотришь дату изменения этого файла style.css:

function getModificationTime($path_to_file)
{
    return (new Datetime())->setTimestamp(filemtime('/my/style/paths/' . $path_to_file));
}

$modify_date = getModificationTime('styles.css');


Далее, в этом контроллере ты проверяешь, пришёл ли от браузера заголовок HTTP_IF_MODIFIED_SINCE (погугли, что это).

/**
     * Возвращает true, если дата (обычно документа) $data является устаревшей
     * по отношению к HTTP заголовку If-Modified-Since.
     *
     * @param $date \DateTime
     * @return bool
     */
    public static function IfModifiedSince(\DateTime $date): bool
    {
        if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
            $if_modified_since = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));

            if ($if_modified_since && $if_modified_since >= $date->getTimestamp()) {
                return false;
            }
        }

        return true;
    }


если true, считываешь css файл и выплёвываешь его посредством этого контроллера (через echo), отправляя http заголовки, присущие для css ('text/css; charset=utf-8') и заголовок Last-Modified с датой $modify_date в формате "D, d M Y H:i:s \G\M\T"

если false (файл не изменился) просто отдаешь http заголовок 304

----

этой информации тебе достаточно, что бы самостоятельно всё самому реализовать
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@prostoprofan
Никогда не используй отдачу CSS или JS файлов как отметили выше через PHP. Т.к. каждый такой запрос по статике грузит твой бэк.
Используй связку Nginx + рандомный request_uri. В качестве request uri я использую microtime(1), последнюю метку храню в БД, а выше предложенный вариант будет каждый раз грузить бэк
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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