PHP: кэширование страниц с состоянием

Я хотел бы использовать кэширование на паре страниц:

  1. отдельные страницы блога
  2. index.php

Однако после создания моей системы, я понял, что заголовки моих страниц изменяются согласно состоянию очень немного (иначе, это говорит что-то как "Привет, johnnie@example.com", если Вы регистрируетесь). Я поэтому хочу удостовериться, что это случайно не отображает неверное имя пользователя или электронную почту вершина.

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

Как я могу обойти это?

5
задан johnnietheblack 19 February 2010 в 21:51
поделиться

7 ответов

Вам нужно подумать о том, зачем вам нужно кэширование. Кэширование - это оптимизация, и, как таковая, должна выполняться только в случае необходимости.

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

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

Рассмотрим страницу, на которой есть персонализированный элемент (скажем, Hello Johnnie) и часть, которую дорого вычислять, но которая меняется относительно редко и одинакова для всех пользователей - скажем, цены на акции.

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

Большинство компаний обнаруживают, что генерация внешнего интерфейса требует значительных вычислительных затрат (к сожалению, склеивание HTML занимает много времени), но при этом очень хорошо масштабируется - это означает, что вы можете просто добавить больше жестянок, если скорость недостаточна. С другой стороны, внутренние серверы могут выполнять гораздо больше работы, но масштабируются гораздо хуже - например, базы данных - вы не можете просто добавить больше серверов, потому что существуют проблемы согласованности / синхронизации, которые ограничивают масштабируемость.

8
ответ дан 18 December 2019 в 09:07
поделиться

Какой шаблонизатор вы используете? Умный? в таком случае вы можете принудительно не кэшировать некоторые динамические части веб-страницы, подобные этой

{nocache}
Hello {$username} This is your Email {$email}
{/nocache}
1
ответ дан 18 December 2019 в 09:07
поделиться

Где вы хотите кэшировать?

На вашем сервере? Возможно, вам стоит обратить внимание на Smarty.

На прокси-серверах/клиентах? Тогда сделайте html-страницу кэшируемой, замените любое динамическое содержимое пустыми div'ами и запишите значения с помощью javascript - javascript может кэшировать часть информации в cookies и возвращаться к серверу за остальным.

Или посмотрите на заголовок 'Varies: Cookie", чтобы узнать, как сделать сеансово-ориентированное кэширование.

C.

1
ответ дан 18 December 2019 в 09:07
поделиться

Честно говоря, это, вероятно, излишек для того, что вы хотите, но ESI решает проблемы, с которыми вы сталкиваетесь.

Тем не менее, вы также можете подумать над этим: какая часть вашего трафика входит в систему? Для многих веб-приложений 90% + трафика является анонимным, и все анонимные страницы отображаются одинаково. Простое кеширование анонимных страниц может дать вам много преимуществ, которые вы ищете, без особой работы.

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

1
ответ дан 18 December 2019 в 09:07
поделиться

Не кэшируйте всю страницу - просто кешируйте ту часть, которая требует фактического кэширования (например, часть, которая избавит вас от открытия соединения с базой данных). Тогда остальная часть страницы все еще может быть динамической, и я предполагаю, что вы сохраняете имя пользователя в переменной сеанса, так что вы все равно можете, например,

echo "Hello ".$_SESSION['username'];
1
ответ дан 18 December 2019 в 09:07
поделиться

Несколько раз я использовал возможность:

  • сгенерировать страницу и сохранить ее в кеше, содержащую что-то вроде « Привет, %% PLACEHOLDER_NAME %% » вместо настоящее имя.
  • , когда пользователь загружает страницу:
    • загрузить кешированную страницу
    • выполнить (быстро) str_replace , чтобы заменить %% PLACEHOLDER_NAME %% с именем пользователя
    • отправляет "частично динамическую" страницу, которую вы создали таким образом.

Это означает, что вам придется проделать некоторые манипуляции с PHP, и вы не сможете кэшировать всю страницу или использовать ее как статический файл ...

... Но это также означает, что почти вся страница будет в кеше - вам не нужно будет выполнять какие-либо запросы к базе данных, например, если имя хранится в сеансе.

(Некоторые скажут, что это немного «грязно» - но это действительно хорошо работает, когда есть только одна или две небольшие части, которые должны быть динамическими, что, кажется, так в вашей ситуации)


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

Это означает, что вам нужно будет извлечь данные из кеша и склеить их вместе, чтобы сгенерировать страницу - но, таким образом, вы все равно избежите некоторого количества SQL-запросов, поскольку большая часть ваших данных будет загружена из кеш.

4
ответ дан 18 December 2019 в 09:07
поделиться

Вы можете использовать параметры, специфичные для пользователя, как Cache_ID или Cache_ID_Key, используемые в большинстве библиотек кэша:

пример:

$id = sh1($userMail);
$cache->save($id);

Это минимальный пример. Идея в том, что "ключ должен включать специфическую информацию пользователя", которая уникальна для каждого пользователя.

Надеюсь, вы поняли идею.

2
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

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