Я написал свою небольшую PHP MVC Framework, и теперь Im исследую стратегии кэширования в PHP MVC Framework. Я думаю о том, что можно кэшировать, где и как.
У меня есть простая структура MVC. У меня есть фронт-контроллер, который загружает приложение, регистрирует автоматическую загрузку класса, настраивает директивы времени выполнения php … и в конце анализирует URL-адрес и отправляет запрос соответствующему контроллеру, методу, контроллеру действий, как бы вы его называть. Из контроллера у меня есть доступ к объектам Domain и Data Mappers, которые могут переносить объекты домена на некоторое хранилище, большую часть времени Relation Database. Из контроллеров у меня есть доступ к объектам Domain и Data Mappers.
Что касается кэширования, то это то, что я могу знать, что могу сделать в данный момент. С PHP я могу использовать кэш APC, который является кэшем операций операций, но я также могу использовать его для сохранения переменных в ОЗУ. Затем я могу использовать Memcache и Memcahed, которые работают в качестве кеша APC, но я могу получить доступ к сохраненному кешу с разных серверов. Если мне нужно масштабировать. И эти два не являются кэшами opcode.
Насколько я знаю, я могу это сделать:
Когда в контроллерах я могу сохранить объекты домена в кеш, поэтому мне не нужно открывать подключение к базе данных каждый раз, если у меня уже есть этот объект домена в кеше.
Я могу создать свою систему кэширования, которая будет анализировать URL-адреса при загрузке, а затем получить уже интерпретированную страницу для этого URL-адреса, если существует кеш с этим URL-адресом страницы, если бы он не обрабатывал запрос, а затем сохранял эту страницу в кеше и связывал ее с текущим URL-адресом
Итак, как вы можете видеть, я действительно не знаю, как реализовать кеш в моем MVC, и где я должен кэшировать вещи, как и какие возможности существуют.
Так может кто-нибудь объяснить это лучше или перенаправить меня на некоторые хорошие статьи, где я мог бы узнать о кешировании?
Благодаря!
Кэш опкода используется для компенсации стоимости интерпретации кода PHP для каждого запроса. Это связано с инфраструктурой сервера. Это похоже на балансировку нагрузки. Оставьте его администратору. Или кто-то, кто использовал * NIX дистрибутив, это не ubuntu.
В приложении MVC есть 3 балла, где вы можете кэшировать вещи:
периферия:
Части приложения, которые на самом деле не связаны с самим шаблоном MVC, но участвуют в получении MVC: механизм маршрутизации и (если вы его используете) DIC.
То, что вы можете кэшировать для механизмов маршрутизации, зависит от реализации. Если вы используете некоторое генерирование регулярных выражений из более читаемых шаблонов, вы можете кэшировать полученные выражения. А также можно кэшировать часть параметров, которые обычно создаются по маршруту. Оба они разумны на средних / крупных сайтах и совершенно бессмысленны для небольших .
Если вы решили использовать DIC (лично я считаю, что это антипаттерн, но все классные дети не согласны), то кэширование является почти обязательным, потому что правильно написанная DIC будет использовать отражения. И отражения медленные.
ответ
Иногда есть части приложения, которые требуют большого количества ресурсов для создания. Если ваша интерпретация MVC имеет полностью реализованный вид, тогда можно кэшировать некоторые из шаблонов, которые используются для генерации вывода.
Например, возьмите сайт, например StackOverflow. Если вы решили создать блок «верхние теги за последние 24 часа» на боковой панели, было бы невозможно восстановить его для каждого вида страницы. Одним из способов обойти это ограничение было бы пересчитать теги только каждый час или около того и сохранить сгенерированный результат в фрагменте HTML. Затем этот фрагмент можно повторно использовать снова. Если кешированный фрагмент – это некоторый JSON, используемый XHR, вы даже можете добавить заголовок expire на стороне клиента, чтобы еще больше снизить нагрузку на сервер.
Вы можете кэшировать только фрагменты страницы или всего этого. Это в основном то, как на сайте с архитектурой с архитектурой MVC речь идет о частях, имеющих статический контент.
модельный слой
Это сложный бит.
Прежде всего, вы должны понимать, что кеш – это еще одна форма хранения, а это означает, что кеширование обрабатывается специальными картографами.
$user = new User; $cache = new UserCacheMapper; $user->setId( 42 ); if ( ! $cache->fetch( $user ) ) { $storage = new UserDbMapper( $pdo ); $storage->fetch( $user ); $cache->store( $user ); } // the $user object has been initialized
Mapper кэша также является местом, где произойдет недействительность кеша, и таким образом вы можете добавить механизм кэширования на любом этапе проекта.
Хотя я бы рекомендовал прекратить использование контроллеров для обработки взаимодействия между объектами домена и хранилищем. В основном вы протекаете бизнес-логику домена на уровне презентации. Я бы рекомендовал создать службы, содержащие эту часть приложения, и позволить вам изолировать контроллеры от логики домена.