cotonti.com : Расскажите в 2х словах как работает кеширование данных по $db_users https://www.cotonti.com Neueste Themenbeiträge Cotonti en Thu, 05 Feb 2026 16:01:54 -0000 Cotonti Aik #45835 Alex300:

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

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

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

]]>
Fr, 06 Jan 2023 19:59:33 -0000
Alex300 Класс CotDb https://github.com/Cotonti/Cotonti/blob/master/system/database.php не содержит метода query_cache() и никогда его не содержал. И добавления этого метода в него не планируется. Работа с кешем в Cotonti устроена не много иначе.

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

]]>
Fr, 06 Jan 2023 19:50:20 -0000
Cotonti Aik #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;
    }
}

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

]]>
Fr, 06 Jan 2023 19:11:43 -0000
Alex300 Хм, интересно, и где же объявлен метод query_cache()? Может я что то упустил?

]]>
Fr, 06 Jan 2023 18:46:35 -0000
Cotonti Aik 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 уже есть в кеше, то они будут загружены из кеша, а не из базы данных. Если же данные не найдены в кеше, то будет выполнен запрос к базе данных, и результаты будут сохранены в кеш для последующих запросов.

]]>
Fr, 06 Jan 2023 15:16:08 -0000
Alex300 Когда достаешь одно поле - не уверен. Но в целом да.

]]>
Mo, 03 Okt 2022 13:01:06 -0000
Kopusha По сути если мне надо выдернуть в разных местах/модулях/плагинах что то наподобии (что естественно коряво, но я это писал только изучая 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'];

 

]]>
Mo, 03 Okt 2022 09:41:35 -0000
Alex300 Вот тут 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 сохраняет свое значение между вызывами функции. Если вы несколько раз вызовите ее для полученя данных одного и того же пользователя (за один запрос к серверу) то данные из БД будут запрошены только один раз.

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

]]>
Mo, 03 Okt 2022 07:28:00 -0000
Kopusha Собственно что хочу понять: 
есть вот это - 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

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

]]>
So, 02 Okt 2022 11:36:42 -0000