Задать вопрос

Как сделать кэширование выборки из базы данных и отдельных элементов страниц?

Всем привет! На днях задался вопросом, как лучше организовать кэширование. Дело в том что у меня есть некоторые элементы, которые выводятся один раз, а есть, которые выводятся в зависимости от запроса. Например главное меню получаю из базы данных и нет необходимости изменять его до конца сессии, но каждый раз при обновлении страницы или переходе по ссылке происходит обращение к бд. Думаю что это будет создавать нагрузку на сервер. Некоторые страницы тоже содержат информацию, которую нет необходимости часто обновлять, например страница выбора товара в интернет-магазине, там почти весь контент получаю с помощью ajax запроса и есть статичное меню, которое достаточно большое и нет необходимости каждый раз его обновлять. Я где-то прочитал про кэширование в сессию и решил попробовать. Запихнул массив меню каталога и массив меню на странице товара в сессию и теперь данные из бд извлекаю только при первом открытии страницы, потом они все берутся из сессии. Но мне кажется что это не правильно и может создавать большую нагрузку, чем выборка из бд. Пожалуйста посоветуйте как лучше организовать такое кэширование? Есть же наверняка более эффективные, предназначенные для этого методы. Заранее спасибо!
  • Вопрос задан
  • 473 просмотра
Подписаться 3 Оценить Комментировать
Решение пользователя Константин Б. К ответам на вопрос (3)
@Kostik_1993
Web Developer
memcacheD, если он не стоит то тогда memcache
<?php

class Cache
{
	
	private $memcache;
	
	public function __construct()
    {
		if (extension_loaded('memcache')) 
		{
			$this->memcache = new Memcache();
			
			$this->memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
		}
    }
	
	public function __destruct()
    {
		$this->memcache->close();
    }

	public function save($key, $data, $time = 0)
	{
		$this->memcache->set($key, $data, MEMCACHE_COMPRESSED, $time);
	}
	
	public function load($key)
	{
		$get_result = $this->memcache->get($key);
		
		return $get_result;
	}
	
	public function delete($key)
	{
		$this->memcache->delete($key);
	}
	
	public function clear()
	{
		$this->memcache->flush();
	}

	public static function make(Closure $object, $time, $key){
		
		$cache = new Cache();
		
		if (!$cacheData = $cache->load($key)){
			
			$object = is_callable($object) ? call_user_func($object):$object;
			
			$cache->save($key, $object, $time);

			return $object;
		}
		else
		{
			return $cacheData;
		}
	}

}


// Cache::make($value, $time, $key);

		$data = Cache::make(function(){
		
			return DB::from("users")->orderBy("name DESC")->paginate(28)->fetchAll();
		
		}, 5, md5($_SERVER['REQUEST_URI']) );
Ответ написан