Задать вопрос

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

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

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

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

Единственное что приходит на ум, это как-то кэшировать только 1 блок на странице, которой генерируется до 7 секунд, где-то читал что так можно, но найти не смог, прошу помощи
  • Вопрос задан
  • 626 просмотров
Подписаться 4 Простой 2 комментария
Решения вопроса 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);
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
18 янв. 2025, в 03:12
1000 руб./за проект
18 янв. 2025, в 00:01
500 руб./за проект
17 янв. 2025, в 23:56
10000 руб./за проект