Вопрос по объектному кешированию

12
MB
На сайте с 24.02.2009
Offline
162
280
Всем привет.
Возникла необходимость закешировать один блок на сайте, а именно вывод последних поисков, использовал вот этот код, вставил его перед блоком который надо кешировать
// префикс и местоположение файлов кэша
define('CACHE_PATH', "/tmp/cache_");
// как долго хранить кэшируемые файлы, в часах
define('CACHE_TIME', 1);
// вернуть местоположение и название кэш-файла
function cache_file()
{
    return CACHE_PATH . md5($_SERVER['REQUEST_URI']); // тут заменил на 
SERVER_NAME  чтоб создавался только один файл кэша
}
// отобразить кэш, если его "срок годности" не истёк
function cache_display()
{
    $file = cache_file();
    // проверка, что кэш-файл существует и он не слишком старый
    if(!file_exists($file)) return;
    if(filemtime($file) < time() - CACHE_TIME * 3600) return;

    // если всё ок, то отобразить кэш-файл и прекратить дальнейшие проверки
    readfile($file);
    exit;
}
//запись в кэш-файл
function cache_page($content)
{
    if(false !== ($f = @fopen(cache_file(), 'w'))) {
    fwrite($f, $content);
    fclose($f);
        }
        return $content;
}
// выполнение прекращается, если был найден валидный (исправный) кэш-файл
cache_display();
// активировать внешнюю буферизацию и создать кэш-файл
ob_start('cache_page');
Сюда вставляю блок который надо закешировать, условно <?php last_searches() ?> он кешируется, но вот проблемка, весь оставшийся вывод страницы тоже кешируется, то есть блок <?php footer() ?> мне не надо кешировать, там есть динамические php скрипты которые нельзя кешировать.
Как прервать кеширование и вывести оставшуюся часть кода не из кеша?
Пробовал добавлять после <?php last_searches() ?><? ob_end_flush() ?> так блок кешируется и берётся из кеша, но оставшийся вывод страницы не выводится, то есть страница прерывается на закешированном блоке, а мне надо чтобы оставшаяся часть загружалась не из кеша, возможно ли такое сделать?
W1
На сайте с 22.01.2021
Offline
285
#1
А каким боком тут "объектное" кеширование?
Мой форум - https://webinfo.guru –Там я всегда на связи
W1
На сайте с 22.01.2021
Offline
285
#2
Mister_Black :
оставшийся вывод страницы не выводится, то есть страница прерывается на закешированном блоке

У тебя функция 

cache_display()

заканчивается конструкцией exit. И чего ты тогда ещё ожидаешь?

MB
На сайте с 24.02.2009
Offline
162
#3
webinfo #:

Проверь скрипт на ошибки.

Ошибок нет, это вордпресс, какие там могут быть ошибки, там всё по блокам, мне надо исключить footer, да возможно я неправильно назвал это объектным кешированием, это буфер вывода, читаю сейчас в других местах и похоже нет такого способа вывести остальной код после кешированного с помощью буфера вывода, либо прерывать, либо кешировать всё, либо опускать кешируемый блок в самый низ страницы чтобы он ничего другого не кешировал, а уже потом выводить этот блок с помощью css в другом месте страницы, в моём случае можно ещё перенести из футера динамические скрипты в другое место и кешировать вместе с футером, короче буду думать, пока включил request_uri и кеширую каждую страницу, что как бы не очень хорошо, за сутки 10к файлов набралось в папке кеша, нагрузка на файловую систему впски растёт.

W1
На сайте с 22.01.2021
Offline
285
#4
Mister_Black #:
короче буду думать

Тут нехрена думать, я выше исправил свой коммент.

MB
На сайте с 24.02.2009
Offline
162
#5
webinfo #:

Тут нехрена думать, я выше исправил свой коммент.

То есть убрать exit или заменить его на что то другое? Просто конкретно в этом коде я не шибко разбираюсь, взял его с другого сайта он вроде работает, кеширует, ошибок не выдаёт.
W1
На сайте с 22.01.2021
Offline
285
#6
Mister_Black #:
То есть убрать exit или заменить его на что то другое? Просто конкретно в этом коде я не шибко разбираюсь, взял его с другого сайта он вроде работает, кеширует, ошибок не выдаёт.

Конструкция exit прерывает выполнение всего скрипта. Поэтому после окончания работы функции уже ничего не происходит. Просто убери  exit. Это что касается функции. Ну и надо как-то переписать слегка код, чтобы в случае вывода контента из файла не выводился контент из  last_searches() . Сейчас там чуть накосячено, как мне кажется. Лень конкретное решение писать, время позднее уже.

MB
На сайте с 24.02.2009
Offline
162
#7
webinfo #:

Конструкция exit прерывает выполнение всего скрипта. Поэтому после окончания работы функции уже ничего не происходит. Просто убери  exit.

exit убрал, но теперь появилась другая проблема, блок кешируется, но отображается дублем, получается показываются два блока один из кеша, а другой не из кеша, но вывод страницы теперь не прерывается, осталось теперь разобраться с дублем.
UPD: ob_end_flush поменял на ob_get_clean, так дубля нет, только надо убедиться что вывод берётся из кеша.
upd2: судя по времени отклика, вывод берётся не из кеша :(

Виктор Горняков
На сайте с 25.09.2006
Offline
162
#8

В вашей конструкции, кажется мне, что подгружается вся страница с блоком, а затем он кэшируется (пытается, создавая нагрузку).

Чую, что по факту кэш создаётся каждый раз, после F5.

Проверьте дату создания КЭШ файлов (время)...

ob_get_.... а тут зависит от сервера, а не от хостинга, чем больше оперативы, тем лучше.

По нашенски, по "Русски" -  Нах облегчать и оптимизировать код, когда можно увеличить мощностя сервера.

XMLSeo - поисковая выдача Яндекс, Wordstat, Google через API - https://xmlseo.ru
MB
На сайте с 24.02.2009
Offline
162
#9
Виктор Горняков #:

В вашей конструкции, кажется мне, что подгружается вся страница с блоком, а затем он кэшируется (пытается, создавая нагрузку).

Чую, что по факту кэш создаётся каждый раз, после F5.

Проверьте дату создания КЭШ файлов (время)...

ob_get_.... а тут зависит от сервера, а не от хостинга, чем больше оперативы, тем лучше.

По нашенски, по "Русски" -  Нах облегчать и оптимизировать код, когда можно увеличить мощностя сервера.

Да когда убран exit; кеш при каждом обновлении страницы заново создаётся, если exit добавить, то кеш нормально работает, при обновлении страницы не пересоздаётся, но кеширует весь вывод, либо обрезает при добавлении ob_end_flush, а мне надо кешировать только отдельный блок на странице, пока в тупике.
D
На сайте с 02.02.2010
Offline
132
#10
У вордпресса есть Transients API
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий