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

Всем привет! На днях задался вопросом, как лучше организовать кэширование. Дело в том что у меня есть некоторые элементы, которые выводятся один раз, а есть, которые выводятся в зависимости от запроса. Например главное меню получаю из базы данных и нет необходимости изменять его до конца сессии, но каждый раз при обновлении страницы или переходе по ссылке происходит обращение к бд. Думаю что это будет создавать нагрузку на сервер. Некоторые страницы тоже содержат информацию, которую нет необходимости часто обновлять, например страница выбора товара в интернет-магазине, там почти весь контент получаю с помощью ajax запроса и есть статичное меню, которое достаточно большое и нет необходимости каждый раз его обновлять. Я где-то прочитал про кэширование в сессию и решил попробовать. Запихнул массив меню каталога и массив меню на странице товара в сессию и теперь данные из бд извлекаю только при первом открытии страницы, потом они все берутся из сессии. Но мне кажется что это не правильно и может создавать большую нагрузку, чем выборка из бд. Пожалуйста посоветуйте как лучше организовать такое кэширование? Есть же наверняка более эффективные, предназначенные для этого методы. Заранее спасибо!
  • Вопрос задан
  • 450 просмотров
Решения вопроса 3
Stalker_RED
@Stalker_RED
Я тут ещё нашел статью одну: https://htmlweb.ru/php/php_cache.php
Какой метод лучше использовать? Этот или тот что описан в статье?


Они о разном по большей части. В статье рассказано о http заголовках описано кеширование страниц и блоков в файлы. А вы хотите кешировать данные из БД. Кстати, Memcache был хорош когда только-только появился и занял всю нишу, но сейчас Redis обходит его практически по всем параметрам. И по возможностям, и по скорости и по надежности.

А еще есть кеширование кода: https://ru.wikipedia.org/wiki/Акселератор_PHP
Ответ написан
LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии
memcached
данные хранятся в виде ключ-значение, в оперативке, пользоваться не трудно
Ответ написан
@Kostik_1993
Fullstack Web Developer | PHP | Laravel | Vue.js
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']) );
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы