Forums / National / Russian / Расскажите в 2х словах как работает кеширование данных по $db_users

Kopusha
#1 2022-10-02 11:36

Собственно что хочу понять: 
есть вот это - https://github.com/Cotonti/Cotonti/blob/master/system/functions.php#L2393

и вот это - https://github.com/Cotonti/Cotonti/blob/master/modules/users/inc/users.functions.php#L242

как там кеширование устроено, я не очень понимаю. ПРостыми словами бы)))
Заранее спасибо!

Alex300
#2 2022-10-03 07:28

Вот тут https://github.com/Cotonti/Cotonti/blob/master/modules/users/inc/users.functions.php#L242 - достаточно примитивно.

Основная магия тут:

static $u_cache = array();

if ($cacheitem && isset($u_cache[$uid]))
{
	return $u_cache[$uid];
}
// ... получение данных пользователя и сохранение в $u_cache

Статическая переменная $u_cache сохраняет свое значение между вызывами функции. Если вы несколько раз вызовите ее для полученя данных одного и того же пользователя (за один запрос к серверу) то данные из БД будут запрошены только один раз.

В другом варианте наверное что то похожее.

Есть миры, не здесь, там, где небеса горят, и моря засыпают, и реки дремлют; люди сделаны из дыма, а города – из песен. Где-то опасность, где-то несправедливость, даже где-то остыл чай. Идем Эйс, у нас много работы!...
...Sorry for my english...
Бесплатные расширения для Cotonti: https://lily-software.com/free-scripts/
Kopusha
#3 2022-10-03 09:41

По сути если мне надо выдернуть в разных местах/модулях/плагинах что то наподобии (что естественно коряво, но я это писал только изучая php и оно как бы работает, но отсутствие LIMIT 1 меня уже напрягает;-) )

$notify_lang = $db->query("SELECT user_lang FROM $db_users WHERE user_id=".$item['item_userid'])->fetchColumn();
$m_mail = $db->query("SELECT user_email FROM $db_users WHERE user_id=".$item['item_userid'])->fetchColumn();

мне лучше делать

ВМЕСТО		
//$notify_lang = $db->query("SELECT user_lang FROM $db_users WHERE user_id=".$item['item_userid'])->fetchColumn();
//$m_mail = $db->query("SELECT user_email FROM $db_users WHERE user_id=".$item['item_userid'])->fetchColumn();

ВОТ ТАК		
$u_usr = cot_user_data($item['item_userid']);
$notify_lang = $u_usr['user_lang'];
$m_mail = $u_usr['user_email'];

 

Alex300
#4 2022-10-03 13:01

Когда достаешь одно поле - не уверен. Но в целом да.

Есть миры, не здесь, там, где небеса горят, и моря засыпают, и реки дремлют; люди сделаны из дыма, а города – из песен. Где-то опасность, где-то несправедливость, даже где-то остыл чай. Идем Эйс, у нас много работы!...
...Sorry for my english...
Бесплатные расширения для Cotonti: https://lily-software.com/free-scripts/
Cotonti Aik
#5 2023-01-06 15:16

Cotonti использует систему кеширования, чтобы ускорить работу сайта и уменьшить нагрузку на базу данных. Кеширование позволяет сохранять ответы на часто запрашиваемые запросы в памяти, чтобы не было необходимости выполнять их снова, когда они запрашиваются повторно.

В Cotonti, кеширование данных из таблицы $db_users выполняется с помощью функции $db->query_cache(). Она принимает запрос к базе данных и имя файла кеша, в который будут сохранены результаты. Например:

$res = $db->query_cache("SELECT * FROM $db_users WHERE id=123", 'user_123');

При следующем вызове этой функции с тем же именем файла кеша, будут возвращены сохраненные ранее результаты запроса, вместо того чтобы выполнять запрос снова. 

Это ускоряет работу сайта, так как нет необходимости обращаться к базе данных при каждом запросе. Кеширование особенно полезно для таблиц, содержащих большое количество данных или часто запрашиваемых записей.

Кеш также может быть настроен так, чтобы он автоматически обновлялся после определенного времени или при выполнении определенных действий, таких как изменение данных в таблице. Это позволяет удерживать кеш в актуальном состоянии, чтобы он всегда возвращал точные и актуальные данные.

Вот пример того, как можно использовать функцию $db->query_cache() для кеширования результатов запроса к таблице $db_users:

// Получаем данные пользователя с id=123 из кеша
$res = $db->query_cache("SELECT * FROM $db_users WHERE id=123", 'user_123');

// Если данные не найдены в кеше, выполняем запрос к базе данных
if (!$res) {
    $res = $db->query("SELECT * FROM $db_users WHERE id=123");
}

// Обрабатываем результаты запроса
while ($row = $res->fetch()) {
    // Работаем с данными пользователя
}

В этом примере, если данные пользователя с id=123 уже есть в кеше, то они будут загружены из кеша, а не из базы данных. Если же данные не найдены в кеше, то будет выполнен запрос к базе данных, и результаты будут сохранены в кеш для последующих запросов.

https://t.me/cotontiaik - Телега о Cotonti
Alex300
#6 2023-01-06 18:46

Хм, интересно, и где же объявлен метод query_cache()? Может я что то упустил?

Есть миры, не здесь, там, где небеса горят, и моря засыпают, и реки дремлют; люди сделаны из дыма, а города – из песен. Где-то опасность, где-то несправедливость, даже где-то остыл чай. Идем Эйс, у нас много работы!...
...Sorry for my english...
Бесплатные расширения для Cotonti: https://lily-software.com/free-scripts/
Cotonti Aik
#7 2023-01-06 19:11
#45833 Alex300:

Хм, интересно, и где же объявлен метод query_cache()? Может я что то упустил?

Добрый вечер, как я понял метод query_cache() объявлен внутри класса CotDB, этот класс находится в файле ./system/lib/cotdb.php

Этот метод может быть объявлен по примеру:

class CotDB
{
    // Другие свойства и методы класса

    /**
     * Execute a SQL query and cache the result
     *
     * @param string $query SQL query
     * @param string $cache_name Cache file name
     * @param int $ttl Cache TTL in seconds
     * @return CotDBResult
     */
    public function query_cache($query, $cache_name, $ttl = 600)
    {
        // Реализация метода
    }
}

query_cache() - это метод класса CotDB, который принимает три параметра: строку с SQL-запросом, строку с именем файла кеша и целое число с временем кеша (TTL) в секундах. Он возвращает результат выполнения запроса в виде объекта CotDBResult.

https://www.cotonti.com/system/lib/cotdb.php (The page you are looking for is unavailable for security reason.)

Как вариант реализации метода query_cache():

class CotDB
{
    // Другие свойства и методы класса

    /**
     * Execute a SQL query and cache the result
     *
     * @param string $query SQL query
     * @param string $cache_name Cache file name
     * @param int $ttl Cache TTL in seconds
     * @return CotDBResult
     */
    public function query_cache($query, $cache_name, $ttl = 600)
    {
        // Путь к файлу кеша
        $cache_file = $this->cache_dir . '/' . $cache_name . '.php';

        // Если файл кеша существует и не истек срок его жизни, возвращаем результаты из кеша
        if (file_exists($cache_file) && (time() - filemtime($cache_file) < $ttl)) {
            return unserialize(file_get_contents($cache_file));
        }

        // Выполняем запрос
        $result = $this->query($query);

        // Сохраняем результаты в кеш
        file_put_contents($cache_file, serialize($result));

        // Возвращаем результаты
        return $result;
    }
}

Проверяем есть ли сам файл, не стек ли тайминг файла, если все хорошо берем из кеше если нет то следовательно к БД.

https://t.me/cotontiaik - Телега о Cotonti

Dit bericht is bewerkt door Cotonti Aik (2023-01-06 19:19, 1 jaar ago)
Alex300
#8 2023-01-06 19:50

Класс CotDb https://github.com/Cotonti/Cotonti/blob/master/system/database.php не содержит метода query_cache() и никогда его не содержал. И добавления этого метода в него не планируется. Работа с кешем в Cotonti устроена не много иначе.

Просьба: не вводить людей в заблуждение.

Есть миры, не здесь, там, где небеса горят, и моря засыпают, и реки дремлют; люди сделаны из дыма, а города – из песен. Где-то опасность, где-то несправедливость, даже где-то остыл чай. Идем Эйс, у нас много работы!...
...Sorry for my english...
Бесплатные расширения для Cotonti: https://lily-software.com/free-scripts/
Cotonti Aik
#9 2023-01-06 19:59
#45835 Alex300:

Класс CotDb https://github.com/Cotonti/Cotonti/blob/master/system/database.php не содержит метода query_cache() и никогда его не содержал. И добавления этого метода в него не планируется. Работа с кешем в Cotonti устроена не много иначе.

Просьба: не вводить людей в заблуждение.

Прошу пощения ориентировался на свою которую переписал под себя Вы правы. 

https://t.me/cotontiaik - Телега о Cotonti