О кэшировании в Web

День добрый, дражайший читатель.

Вообще, я не имею уж очень большого опыта в работе с высоконагруженными системами. Обычно проекты, которые мне доводилось делать, были рассчитаны на посещаемость в 20000 человек в сутки. Ну или около того. Однако, однако… Программисты народ странный. Мы иногда делаем нечто «на будущее». Ну вдруг потребуется. Но вначале немного теории. Как строится высоконагруженная система? Основной её компонент — это балансировщик нагрузки. Фактически он просто обеспечивает обработку запроса пользователя одним из нескольких back-end’ов. Например один балансирощик (и лично мне доводилось слышать, что в его роли может выступать например nginx), раскидывает запросы по нескольким PHP-сборщикам (или бросается смотреть в кэш — нет ли уже того, что требуется). Те, соответственно формируют контент, и отдают его обратно. Это очень упрощённо, прямо скажем. Потому что я всё-таки не администратор веб-серверов, и всех тонкостей не знаю.

Так вот, это я к тому, что кэширование — один из действенных способов снижения нагрузки. Зачем выполнять кучу кода для формирования HTML-контента, если такая работа уже была сделана ранее, и с тех пор ничего не поменялось? Правильно, незачем. Так не логичнее ли сохранить страницу в кэш, и отдавать её каждый раз быстро и без мучений? Логичнее, все так и делают. И вот тут есть выбор — где размещать кэш. Существует много вариантов, но если свести к основным, это либо жёсткий диск, либо оперативная память. Чувствуете разницу? Скорость обращения к жёсткому диску в разы ниже, чем к оперативке, но при этом кэширование на жёстком диске подходит практически для любого хостинга, в том числе и виртуального. Однако важно понимать, что высоконагруженные проекты никогда не размещаются на виртуальном хосте. Его мощностей и возможностей просто не хватит для обработки такого потока данных. Потому для просто посещаемых проектов это минимум VPS. А для проектов с высокой нагрузкой необходимо строить распределённую систему с балансировкой, отдельным сервером для БД, для кэшировщика, для контент-сборщиков и так далее. Это дорого, но как правило ресурс окупает подобные затраты.

Итак, первый вывод, это то, что для нагруженных проектов необходимо использовать кэширование в памяти. Выбор тут обычно останавливается на Memcached. Однако, существуют и другие возможности — многие системы PHP-кэширования распространённые (APC, XCache, а до недавнего времени и eAccelerator) позволяют сохранять в кэш и пользовательские значения. eAccelerator правда с недавнего времени уже не поддерживает пользовательских функций, а конкретнее, начиная с версии 0.9.6.x. Я в принципе считаю, что каждая подсистема должна заниматься своим делом — например APC и прочие перечисленные занимаются тем, что кэшируют промежуточный байт-код PHP, получающийся после «всасывания» текстовых исходников интерпретатором. Соответственно, время на повторную интерпретацию не затрачивается, и исполнение кода происходит быстрее. А вот Memcached предназначен как раз для хранения произвольных значений в памяти. Т.е. фактически сохранение/удаление/получение/обновление в памяти пользовательских данных. При этом сам сервер кэширования может быть выделенным — т.е. находиться физически на другой машине, специально отведённой под данные операции. Он связывается высокоскоростным каналом с потребителем, и все счастливы. При этом потребителей может быть много. Одним словом — в этом случае memcache на мой взгляд всё-таки рулит (к тому же никто не мешает иметь на потребителе-сборщике свою систему кэширования для PHP, чтобы ещё ускорить выполнение).

Ну так вот, выяснили мы, что memcached — это есть хорошо. «И увидел бог, что свет это хорошо, и был день, и было утро»… Так вот. Хорошо-то хорошо, а как получить доступ к телу и использовать это тело в своих интересах? (А также APC и иже с ним, при желании). А есть для PHP кошерный extension — расширение, позволяющее работать с memcached. Оно, собственно, так и называется — php_memcache. Учитывая, о чем идёт речь, я верю в то, что у вас есть возможность доустановить в конфигурацию PHP требуемые расширения. Например для eAccelerator подобное расширение зовётся php_eaccelerator… В общем гугл вам поможет. Это расширение и предоставляет пользовательские функции, позволяющие общаться с сервером. В результате примерно таких рассуждений — была рождена (а правильнее сказать всё-таки написана) библиотека, предназначенная для простого общения с серверами кэширования, в объектно-ориентированном стиле. Кроме того, она довольно легко расширяема. Фактически, класс расширяющий её возможности обязан только реализовать все методы из интерфейса ICacheSystem, после чего немного нужно дополнить класс CCache, чтобы он мог работать с вашим расширением.

Вот кстати по поводу CCache — для работы требуется подключить только его. Он абстрагирует вас от конкретной реализации подсистемы кэширования. Вы при создании, в конструкторе, просто указываете — какой вид кэшировщика вы хотите использовать. И дальше не задумываясь о специфике реализации спокойно работаете с методами SetToCache, GetFromCache и так далее. Выглядит это примерно так:

$cache = new CCache(CCache::CACHE_TYPE_MEMCACHE, 'my_cache_id',
array('memcache_server_1' => '127.0.0.1', 'memcache_port_1'=>11211));

$cache->SetToCache('my_value', array(1), 600);

В принципе, дальнейших объяснений, я полагаю, не требуется. Для работы библиотеки требуется настроенная система кэширования,с которой вы будете работать. Скажем опять-таки memcached. По настройке оного — множество информации в гугле. Аналогично по поводу того, как установить это расширение для PHP. Кроме того, несмотря на включенный в состав класс для eAccelerator, использовать его крайне не рекомендуется по описанным внутри причинам. Ну а остальное ясно из исходников — все они документированы в формате PhpDoc.

Вопросы и пожелания — сюда :) Качаем же тут:

http://up.www.shpargalko.com/php/cachelib/phpCache.zip

Автор

Алекс Разгибалов

Сумасшедший мужчина, неопределённого возраста, наслаждающийся манией преследования. Паталогически недоверчив, эгоистичен, авторитарен. Вторичные диагнозы - программист и поц. Владеет английским языком на уровне около хренового разговорного. Также знаком с некоторыми другими языками. Интересуется всем и вся, за счёт чего в любой области знания являются поверхностными, неглубокими. Характер невыдержанный. Крепость - 55 градусов.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Собирать идеально - не обязательно, просто приблизительно соберите картинку (должен быть включен JavaScript).WordPress CAPTCHA