Кэширование запросов в PHP для производительности MySQL - PullRequest
9 голосов
/ 23 февраля 2011

Я ищу систему для кеширования уже закодированного проекта (с PHP), который имеет такие функции, как система регистрации и входа в систему и т. Д.

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

Что мне действительно нужно, так это хранить результаты некоторых специальных запросов к БД, если есть кеш, вызывать эти результаты, если не генерировать новый кеш, и повторно кэшировать их каждые x минут. (результаты могут быть сохранены в TXT. и т. д.).

Как я могу это сделать?

Кстати, установка query_cache_type в 1 не работает. Я ищу альтернативные решения.

Спасибо

Ответы [ 4 ]

9 голосов
/ 23 февраля 2011

В основном вам нужно кэшировать запрос:

 # After: [with memcache]
    $rSlowQuery = mysql_query_cache($sql);
    # $rSlowQuery is an array
    $rows = count($rSlowQuery);
    for ($i=0;$i<$rows;$i++) { }
5 голосов
/ 07 июня 2013

Сокращение вызовов базы данных Извлечение phpFastCache , которые поддерживают WinCache, MemCache, Files, X-Cache, APC Cache.Для новичков это просто

Класс кэширования PHP для базы данных: на вашем веб-сайте 10 000 посетителей, и ваша динамическая страница должна отправлять 10 000 одинаковых запросов в базу данных при каждой загрузке страницы.С phpFastCache ваша страница отправляет только 1 запрос в БД и использует кеш для обслуживания 9999 других посетителей.

<?php
    // In your config file
    include("php_fast_cache.php");
    // This is Optional Config only. You can skip these lines.
    // phpFastCache support "apc", "memcache", "memcached", "wincache" ,"files", "pdo", "mpdo" and "xcache"
    // You don't need to change your code when you change your caching system. Or simple keep it auto
    phpFastCache::$storage = "auto";
    // End Optionals

    // In your Class, Functions, PHP Pages
    // try to get from Cache first.
    $products = phpFastCache::get("products_page");

    if($products == null) {
        $products = YOUR DB QUERIES || GET_PRODUCTS_FUNCTION;
        // set products in to cache in 600 seconds = 10 minutes
        phpFastCache::set("products_page",$products,600);
    }

    foreach($products as $product) {
        // Output Your Contents HERE
    }
?>
3 голосов
/ 22 марта 2018

Недавно я столкнулся с подобной проблемой, и вот как я ее решил ...


Шаг 1: Добавьте файл .user.ini в корневой каталог вашего проекта (еслиу вас его еще нет) и следующие директивы для файла, чтобы включить плагин mysqlnd_qc и установить TTL для кэша:

; Enables MySQL query caching by PHP
mysqlnd_qc.enable_qc = 1

; Set a default TTL for the caching in seconds
mysqlnd_qc.ttl = 30

Шаг 2: Добавитьподсказка SQL перед любым запросом, который вы хотите кэшировать с помощью mysqlnd_qc.

Вот подсказка, которую необходимо добавить к запросу:

"/*" . MYSQLND_QC_ENABLE_SWITCH . "*/" .

Вот примериспользования:

$res = $mysqli->query("/*" . MYSQLND_QC_ENABLE_SWITCH . "*/" . "SELECT id FROM test WHERE id = 1");

Это должно сделать это!Вы также можете кэшировать все запросы, используя директиву mysqlnd_qc.cache_no_table = 1.

Все это происходит из документации PHP, здесь: http://php.net/manual/en/mysqlnd-qc.quickstart.caching.php

Надеюсь, это поможет!

1 голос
/ 05 января 2013

Вы можете попробовать это:

$mysqli -> query("/*qc=on*/ SELECT * FROM table");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...