Вход • Регистрация

Кеширование отдельной функции

  • 31 января 2013 г.
  • В связи с масштабностью своего проекта (адрес пока не раскрываю, не конкурсный даже)) назрела проблема с необходимостью кешировать запросы к сторонней БД (не диафан)ю Порыскав весь форум, толком не нашел ни одного примера реализации кеша. Не думаю, что требуется для небольшой функции создавать отдельный модуль с неск. взаимосвязанных файлов - нет смысла в этом, он не конфигурируемый. его назначение лишь вывод последних данных с другой БД и все. Одно дело, когда таких функций единицы, но дело пойдет наперекосяк, если нагрузка повысится - увеличится приток посетителей и БД просто будет постоянно делать однообразные left join'ы.
    Есть идея реализации простого кеширования в функции типа такой?
    Код

    public function show_last_torrents()
    {
    /* Соединяемся с базой данных */
    $hostname = "localhost"; // название/путь сервера, с MySQL
    $username = "***"; //
    $password = "***"; //
    $dbName = "database"; // название базы данных

    /* Создаем соединение */
    mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");
    mysql_query ('SET NAMES utf8');

    /* Выбираем базу данных. Если произойдет ошибка - вывести ее */
    mysql_select_db($dbName) or die (mysql_error());

    $query = "SELECT torrents.*,torrents.image1 AS kartinko, categories.id AS catid, free, SUM(trackers.leechers) AS leechers1, SUM(trackers.seeders) AS seeders1, torrents.leechers, torrents.seeders, categories.name AS catname, categories.image AS catimage, trackers.tracker AS local, users.username, users.class FROM torrents LEFT JOIN users ON torrents.owner = users.id LEFT JOIN categories ON torrents.category = categories.id LEFT JOIN trackers ON torrents.id=trackers.torrent WHERE category <> 0 and banned = 'no' GROUP BY torrents.id ORDER BY added DESC LIMIT 12";

    /* Выполняем запрос. Если произойдет ошибка - вывести ее. */
    $res = mysql_query($query) or die(mysql_error());

    /* Выводим данные из таблицы */
    echo ("<ul class=\"list img-list\">");

    /* Цикл вывода данных из базы конкретных полей */
    while ($row = mysql_fetch_array($res)) {
    $text = $row['name'];
    $cat = $row['catname'];
    echo "<li>
    <a href=\"#\" class=\"inner\">
    <div class=\"li-img\">
    <a href=http://tracker.dxp.ru/torrent-$row[id]><img style=\"width: 110px; height: 160px;\" class=\"corner iradius10\" src=\"http://tracker.dxp.ru/torrents/images/$row[kartinko]\">
    </div>
    <div class=\"li-text\">
    <h4 class=\"li-head\">$text</h4>
    <p class=\"li-sub\">Подробнее</p>
    <h4 class=\"li-head\">[$cat]</h4>
    </div>
    </a>
    </li>";
    }
    echo ("</ul>");

    mysql_close();

    }

  • 31 января 2013 г. , редакция: 31 января 2013 г.
  • накидал небольшой класс
    Код
    class SimpleCache{
    var $cachefile;
    var $cachetime;
    function __construct($cachefile,$cachetime=60){
    $this ->cachefile=$cachefile;
    $this -> cachetime =$cachetime;
    }
    function get()
    {
    if (file_exists($this ->cachefile) && time() - $this ->cachetime < filemtime($this ->cachefile)) {
    return file_get_contents($this ->cachefile);
    }
    else return false;
    }
    function set($content){
    $cached = fopen($this -> cachefile, 'w');
    fwrite($cached, $content);
    fclose($cached);
    }
    }

    Вставь его гденить в конце файла.
    Дальше как его используем в твоем случае
    Код

    public function show_last_torrents()
    {

    $Cache=new SimpleCache('cache/torrents.html',60);// кеш на 60 секунд
    if(($content=$Cache->get())===false)
    {
    /* Соединяемся с базой данных */
    $hostname = "localhost"; // название/путь сервера, с MySQL
    $username = "***"; //
    $password = "***"; //
    $dbName = "database"; // название базы данных
    /* Создаем соединение */
    mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");
    mysql_query ('SET NAMES utf8');

    /* Выбираем базу данных. Если произойдет ошибка - вывести ее */
    mysql_select_db($dbName) or die (mysql_error());

    $query = "SELECT torrents.*,torrents.image1 AS kartinko, categories.id AS catid, free, SUM(trackers.leechers) AS leechers1, SUM(trackers.seeders) AS seeders1, torrents.leechers, torrents.seeders, categories.name AS catname, categories.image AS catimage, trackers.tracker AS local, users.username, users.class FROM torrents LEFT JOIN users ON torrents.owner = users.id LEFT JOIN categories ON torrents.category = categories.id LEFT JOIN trackers ON torrents.id=trackers.torrent WHERE category <> 0 and banned = 'no' GROUP BY torrents.id ORDER BY added DESC LIMIT 12";

    /* Выполняем запрос. Если произойдет ошибка - вывести ее. */
    $res = mysql_query($query) or die(mysql_error());

    /* Выводим данные из таблицы */
    $content= "<ul class=\"list img-list\">";

    /* Цикл вывода данных из базы конкретных полей */
    while ($row = mysql_fetch_array($res)) {
    $text = $row['name'];
    $cat = $row['catname'];
    $content.= "<li>
    <a href=\"#\" class=\"inner\">
    <div class=\"li-img\">
    <a href=http://tracker.dxp.ru/torrent-$row[id]><img style=\"width: 110px; height: 160px;\" class=\"corner iradius10\" src=\"http://tracker.dxp.ru/torrents/images/$row[kartinko]\">
    </div>
    <div class=\"li-text\">
    <h4 class=\"li-head\">$text</h4>
    <p class=\"li-sub\">Подробнее</p>
    <h4 class=\"li-head\">[$cat]</h4>
    </div>
    </a>
    </li>";
    }
    $content.="</ul>";
    echo $content;
    $Cache->set($content);
    mysql_close();
    }else echo $content;

    }
    • 31 января 2013 г.
    • спасибо. вставил в конец файла function.php класс SimpleCache, но все равно диафан ругается на якобы отсутствующую функцию:

      Код
      Call to undefined function SimpleCache()
      /home/***.ru/***_ru/includes/function.php:804


      • 31 января 2013 г.
      • забыл new поставить, исправил пост, попробуйте
  • 31 января 2013 г.
  • А теперь без велосипедов, средствами Диафана по документации
    Код
    public function show_last_torrents()
    {
    $cache_meta = array("name" => "torrents");
    if(! $result = $this->diafan->_cache->get($cache_meta, "site"))
    {
    // генерирование кэша
    // cохранение кэша
    /* Соединяемся с базой данных */
    $hostname = "localhost"; // название/путь сервера, с MySQL
    $username = "***"; //
    $password = "***"; //
    $dbName = "database"; // название базы данных

    /* Создаем соединение */
    mysql_connect($hostname, $username, $password) or die ("Не могу создать соединение");
    mysql_query ('SET NAMES utf8');

    /* Выбираем базу данных. Если произойдет ошибка - вывести ее */
    mysql_select_db($dbName) or die (mysql_error());

    $query = "SELECT torrents.*,torrents.image1 AS kartinko, categories.id AS catid, free, SUM(trackers.leechers) AS leechers1, SUM(trackers.seeders) AS seeders1, torrents.leechers, torrents.seeders, categories.name AS catname, categories.image AS catimage, trackers.tracker AS local, users.username, users.class FROM torrents LEFT JOIN users ON torrents.owner = users.id LEFT JOIN categories ON torrents.category = categories.id LEFT JOIN trackers ON torrents.id=trackers.torrent WHERE category <> 0 and banned = 'no' GROUP BY torrents.id ORDER BY added DESC LIMIT 12";

    /* Выполняем запрос. Если произойдет ошибка - вывести ее. */
    $res = mysql_query($query) or die(mysql_error());

    /* Выводим данные из таблицы */
    $content= "<ul class=\"list img-list\">";

    /* Цикл вывода данных из базы конкретных полей */
    while ($row = mysql_fetch_array($res)) {
    $text = $row['name'];
    $cat = $row['catname'];
    $content.= "<li>
    <a href=\"#\" class=\"inner\">
    <div class=\"li-img\">
    <a href=http://tracker.dxp.ru/torrent-$row[id]><img style=\"width: 110px; height: 160px;\" class=\"corner iradius10\" src=\"http://tracker.dxp.ru/torrents/images/$row[kartinko]\">
    </div>
    <div class=\"li-text\">
    <h4 class=\"li-head\">$text</h4>
    <p class=\"li-sub\">Подробнее</p>
    <h4 class=\"li-head\">[$cat]</h4>
    </div>
    </a>
    </li>";
    }
    $content.="</ul>";
    mysql_close();
    $result=array();
    $result['content'] =$content;
    $this->diafan->_cache->save($result, $cache_meta, "site");
    }
    echo $result['content'];
    }
  • 31 января 2013 г.
  • Спасибо большое! все работает на примере SimpleCache!

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум