Как можно кэшировать только часть html кода на странице?

Добрый день, помогите решить проблему, уже не знаю как быть

Есть ряд страниц, на которых выполняется довольно много действий, как в цикле, так и запросами к базе, генерация страницы бывает доходит до 7 секунд. Включил Redis на хостинге и установил плагин W3 Total Cache, включил создание кеша страницы для всех кроме авторизированных, проблема исчезла, т.к обычных пользователей не должно было быть по ТЗ, далее нужно было подключить комментарии и здесь начались проблемы, для корректной работы нужно было выключить кеш для авторизированных пользователей и тогда все работает, кеш сбрасывается сам при добавлении комментария, но тогда страница для таких пользователей грузится до 7 секунд

Если включить кэш и для авторизированных не админов, тогда все вроде нормально, кроме того, что если авторизированный пользователь первый зашел и сгенерировал страницу, то гость без авторизации видит блок того кто сгенерировал кэш

Единственное что приходит на ум, это как-то кэшировать только 1 блок на странице, которой генерируется до 7 секунд, где-то читал что так можно, но найти не смог, прошу помощи
  • Вопрос задан
  • 613 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
$key = "my_heavy_part";

if ($redis->exists($key)) {
  return $redis->get($key);
} else {
  // вычисляете свой кусок, затем
  $redis->set($key, $data);
  $redis->expire($key, 3600); // expires in 1 hour
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
dimasmagadan
@dimasmagadan
для этой цели в WordPress есть
https://codex.wordpress.org/Transients_API
лучше использовать его
Ответ написан
@terka43
А почему нельзя отправить html без "долгоиграющих" кусков, а эти куски ajax подтянуть по готовности?
Ответ написан
@River0051 Автор вопроса
Сделал так и все заработало

function get20($bild_20,$pname)
{
	global $wpdb;
	$current_user = wp_get_current_user();
  ob_start();
  foreach( $bild_20 as $_bild_20 ) { include '20n.php';  }
  return ob_get_clean();
}
$redis = new Redis();
// подключение к серверу
$redis->connect( 'localhost' );
if ( $bild_20 ) {
	echo '<div class="20s '.$pname.'">блок 1</div>'; 
	$key = $pname.'_20_';
	if ($redis->exists($key)) {
	  echo $redis->get($key);
	} else {
	$content20 = get20($bild_20,$pname);
	  // вычисляете свой кусок, затем
	  $redis->set($key, $content20);
	  $redis->expire($key, 3600); // expires in 1 hour
	  echo $redis->get($key);
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы