кэшировать результаты и запросы mysql, только если что-то меняется - PullRequest
4 голосов
/ 03 февраля 2010

Можно ли запросить базу данных только один раз, пока страница загружается в PHP.Каким-то образом сохраните эти результаты и отобразите их пользователю в последующих отчетах.Есть ли способ определить, что-то изменилось в базе данных, чтобы мы могли подключиться к БД только тогда, чтобы получить новые / измененные результаты?

Пожалуйста, дайте мне некоторую идею.Спасибо.

Ответы [ 5 ]

1 голос
/ 03 февраля 2010

Отсюда есть функция , которая переносит любую другую функцию, кэшируя результаты:

function cache_function($buildCallback, array $args= array (), $timeoutMinutes= 60) {
    if (is_array($buildCallback)) {
        $cacheKey= get_class($buildCallback[0]) . $buildCallback[1] . ':' . implode(':', $args);
    } else
        $cacheKey= $buildCallback . ':' . implode(':', $args);

    $file_path= CACHE_PATH . md5($cacheKey);
    @ $file_time= filemtime($file_path);
    $rebuild= $file_time < time() - ($timeoutMinutes * 60);

    //$rebuild= false; // FORCE REBUILD SKIP for WINDOWS

    if ($rebuild or (!$rebuild and !is_readable($file_path))) {
        $build= call_user_func_array($buildCallback, $args);
        file_put_contents($file_path, serialize($build), LOCK_EX);
        return $build;
    }
    return unserialize(file_get_contents($file_path));
}

Также см .:

http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/

1 голос
/ 03 февраля 2010

Кэш, такой как APC, memcached или Xcache, обычно имеет время жизни , прежде чем он устареет. Никаких обращений к базе данных не будет, пока кеш не устарел. Обратите внимание, что no вызовы предпочтительнее, чем кэшированные наборы записей из базы данных, потому что никакие вызовы не сохраняют весь прием туда и обратно.

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

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

1 голос
/ 03 февраля 2010

Проверьте MySQL Query Cache.

MySQL просто вернет тот же набор результатов, сохраненный в памяти, когда не требуется никаких изменений.

http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html

0 голосов
/ 03 февраля 2010

Вы можете использовать систему кэширования для хранения ваших данных.

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

Существует множество способов реализации кэша в PHP, среди которых, как уже упоминалось, Memcached.

0 голосов
/ 03 февраля 2010

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

В одном запросе к базе данных вы можете выбрать это поле (используя легкий SQL-запрос с описанным полем в операторе select) и сравнить его со значением из базы данных Если они различаются, вы знаете, как получать новые данные из БД со сложными запросами.

Пример «легкого» SQL-запроса:

SELECT MAX(last_modification) AS last_modification FROM data_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...