У меня возникают некоторые мысли о том, где реализовать часть кэширования. Где, по-вашему, самое подходящее место для его реализации?
Внутри каждой модели или в контроллере?
// mycontroller.php MyController extends Controller_class { function index () { $data = $this->model->getData(); echo $data; } } // myModel.php MyModel extends Model_Class{ function getData() { $data = memcached->get('data'); if (!$data) { $query->SQL_QUERY("Do query!"); } return $data; } }
// mycontroller.php MyController extends Controller_class { function index () { $dataArray = $this->memcached->getMulti('data','data2'); foreach ($dataArray as $key) { if (!$key) { $data = $this->model->getData(); $this->memcached->set($key, $data); } } echo $data; } } // myModel.php MyModel extends Model_Class{ function getData() { $query->SQL_QUERY("Do query!"); return $data; } }
Мысли:
Подход 1:
Нет мультигитов / мульти-наборов. Если будет возвращено большое количество ключей, накладные расходы будут вызваны.
Проще всего поддерживать, вся обработка баз данных / кеша находится в каждой модели
Подход 2:
Лучше производительность – используется мультимножество / мультирешетка
Требуется больше кода
Сложнее поддерживать
Скажи мне, что ты думаешь!
Кэширование должно выполняться в модели. Если бы мне пришлось выбирать вообще, я бы, вероятно, закончил прозрачно кэширование взаимодействия базы данных модели, что не потребовало бы внесения каких-либо изменений в остальную часть вашего кода. Это, конечно же, будет сделано в родительском классе ваших моделей.
Определенно сосредоточьтесь на кешировании результатов запроса базы данных, так как взаимодействие с вашей базой данных – это то, где вы увидите наибольшие издержки. Я бы сказал, что было бы более эффективно кэшировать результаты вашей базы данных (или, может быть, всю вашу инициализированную модель) больше всего на свете.
Помните, что вы можете сериализовать свои объекты перед кешированием, поэтому отправка сложных типов (массивов или объектов) в memcache не должна быть проблемой. PHP 5 предоставляет магические методы __sleep()
и __wakeup()
для целей серализации и восстановления ваших сериализованных объектов. Кэширование полных объектов в PHP – это, в основном, кусок пирога. См. http://php.net/manual/en/language.oop5.magic.php для получения дополнительной информации.
Независимо от того, решаете ли вы кешировать только свои данные или всю вашу модель сразу после инициализации, зависит от вас.
Я бы сохранил свои обязанности кэширования в рамках модели. Это ни одна из задач контроллера или представления, где модель получает данные. Все, о чем они заботятся, это то, что когда запрашиваются данные, предоставляются данные – так должна работать парадигма MVC.
Представьте свою функциональность mem_cache в родительском классе модели. Он сократит объем кода, который вам нужно написать (code = time = money), упростит изменения в системе и устранит количество ошибок, которые вы производите для каждой модели, которую вы создаете (см. Предыдущую формулу).
Стандартизировать, стандартизировать.