Создание двухпроходной кеш-системы PHP с изменяемыми элементами - PullRequest
5 голосов
/ 01 октября 2008

Я хочу реализовать двухпроходную систему кеширования:

  • При первом проходе генерируется файл PHP со всеми общими вещами (например, новостями), жестко закодированными. Затем в базе данных есть таблица кеша, чтобы связать их со страницами (например, «index.php page = 1 style = default»), база данных также хранит поле обновления, которое, если значение false, вызывает повторный запуск первого прохода при следующем запуске страницы. рассматривается.

  • Второй проход заполняет второстепенные детали, такие как, как давно что-то (?), И изменчивые элементы, такие как «Вы вошли как ...».

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

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

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

Основная проблема связана с уменьшением нагрузки на сервер, так как я работаю на виртуальном хостинге и на данный момент не могу позволить себе обновление, но сайт использует значительную часть ЦП серверов +, что обеспечивает достаточную нагрузку на сервере MySQL.

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

Я на самом деле считал жестким кодирование новостных элементов в виде обычного HTML, но тогда это означает, что они должны храниться в нескольких местах (поскольку они могут использоваться для поиска, а комментарии находятся на странице, посвященной этому новостному элементу (например, news.php). и т. д.).

Ответы [ 6 ]

6 голосов
/ 01 октября 2008

Я вторая запись Кена библиотеки PEAR Cache_Lite , с ее помощью можно легко кэшировать либо части страниц, либо целые страницы.

Если вы используете свой собственный сервер (-ы), я настоятельно рекомендую memcached . Это намного быстрее, так как он работает полностью в памяти и широко используется многими сайтами большого объема. Это очень простой, стабильный, безотказный демон для запуска. С точки зрения вашего кода PHP, вы будете использовать его почти так же, как Cache_Lite, для кэширования различных разделов страницы или полных страниц (или других произвольных блоков данных), и это очень просто использовать, поскольку PHP имеет memcache встроенный интерфейс .

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

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

4 голосов
/ 01 октября 2008

Рекомендую не изобретать велосипед ... Есть некоторые движки шаблонов, которые поддерживают кэширование, например Smarty

3 голосов
/ 01 октября 2008

Для кэширования на стороне сервера используйте что-то вроде Cache_Lite (и пусть кто-то еще беспокоится о блокировке файла, истечении срока действия, повреждении файла)

1 голос
/ 01 октября 2008

Как всегда с этим типом вопроса, мой ответ:

  • Зачем вам кеширование?
  • Ваше приложение потребляет слишком много ввода-вывода в вашей базе данных?
  • Какие показатели вы используете?

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

Возможно, вы действительно выиграете от использования встроенного кеша запросов MySQL, если база данных является точкой разногласия в вашей системе. Другой вариант слишком использовать Memcache.

1 голос
/ 01 октября 2008

Вы хотите сохранить результаты в файл и использовать логику, подобную этой, чтобы вернуть их обратно:

if filename exists
    include filename
else
    generate results
    render to html (as string)
    write to file
    output string or include file
endif

Для ясности, вам не нужно два прохода, потому что вы можете сохранить части страницы и оставить остальные динамическими.

0 голосов
/ 01 октября 2008

Я бы рекомендовал использовать существующий механизм кэширования. В зависимости от того, что вам действительно нужно, вы можете искать APC, memcached, различные библиотеки шаблонов для кеширования ... Легче / быстрее настроить написанный / протестированный код, чтобы удовлетворить ваши потребности, чем писать все с нуля. (обычно, хотя могут быть ситуации, когда у вас нет выбора)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...