We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 26709
    • 4 Posts
    Всем привет!

    Была необходимость сделать оптимизацию сниппетов, напр. ДИТТО, ВЕЙФАЙНДЕР и т.д., чтобы свести к минимуму количество запросов к БД и, тем самым, снизить нагрузку на сервер и увеличить скорость работы сайта.

    Наверное, каждому с такой задачей приходилось сталкиваться, особенно когда с помощью ДИТТО нужно выводить большие количества документов, в который множество ТВ и т.д.(особенно, когда вызовы сниппетов некешируемые). Не секрет, что в таком случае происходит множество запросов. Понятно, что будет при большой посещаемости сайта

    Так вот. Я немного оптимизировал сниппет DITTO Wayfinder и добился удивительного результата. Например, у меня в сайте идет вывод списка документов, в каждом из которых по 10 ТВ. Идет фильтрация по 3 ТВ, вызов некешируемый. При обычных настройках количество запросов к БД составляет 38, но при использовании оптимизированного ДИТТО происходит всего 6 (шесть) запросов!!! И это при некешируемом вызове. Нетрудно подсчитать, насколько выросла происводительность smiley

    Все, что пришлось сделать - это:
    1) везде в сниппетах кешировать запросы к БД. Т.е. при повторном запросе результаты берутся не из БД, а из кеша. Понятно, что при нечастом обновлении БД такой вариант очень подходит. Время кеширования регулируется.
    2) Сделать проверку на модификацию информации в странице. Т.е. при запуске сайта проверяется, изменилась ли с последнего раза инфа в странице. Если изменилась, идет загрузка с сервера. Если не изменилась, то страница грузится с кеша браузера.

    Кому интересно, вылаживаю модернизированные снипеты и измененный файл ИНДЕКС.ПХП. Все, что нужно сделать, так это просто распаковать содержимое архива в корень сайта поверх старых папок и файлов. (ВАЖНО: на всякий случай сначала сохраните старые версии заменяемых файлов и бекап БД).

    Также планирую эту процедуру оптимизации провести со всем МОДХ + сделать возможность выбора кешировать/некешировать и время актуальности кеша.

    Пожалуйста, сообщайте сюда все найденные глюки и недоработки. Итак, качаем, тестируем и высказываемся smiley

    Новая версия 3.0.3 под МОДх 1.0.4
    http://letitbit.net/download/45248.49af32f3880e7f1cf3f35266ef71/MODX-cache_v3.0.3_for_Modx_1.0.4.rar.html

    Версия для МОДх 1.0.0: http://letitbit.net/download/0760.05610bde48a998fb203bd311d/MODX_cache_v3.0_for_Modx_1.0.0.zip.html
      • 33694
      • 742 Posts
      Ух ты, клёво! Спасибо, что поделились.
      Может, при положительных результатах тестирования, имеет смысл обратить на это внимание разработчиков?
        • 24489
        • 60 Posts
        а функцию соединения к базе где взять? лично у меня не работает это дело, нашёл закоментированую строку функции соединения к базе, а сама работа скрипта не находит файл кэша, а он и не создаётся. Законченный скриптик выложите, буду очень признателен, актуально стало. Спасибо
          Плагин для ресайза картинок AutoResizer
          Сниппет для вывода полей документа DocInfo

          Создание ТВ типа checkbox/dropdown из списка дочерних документов tvsLinks
          • 26709
          • 4 Posts
          Quote from: rariteth at Oct 22, 2008, 01:12 PM

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

          Можете уточнить, что именно не работает?
          По идее, все должно работать и скрипт сам подхватывает параметры подключения к БД (т.к. он вызывается в ИНДЕКС. ПХП, где уже произошло соединение с БД).

          Чтобы проверить, работает ли это дело, зайдите в \manager\includes\cachemysql\cache\ и посмотрите, создались ли кеш-файлы с запросами? Если да, то все в порядке.

          Если вдруг будет проблема с коннектом к БД, то зайдите в файл manager\includes\content_monitoring.inc.php  и найдите в самом верху строки
          mysql_connect("localhost", "turosed_turuser2", "htQoPhgrcW76|j4Qlky");
          
          
          if(!mysql_select_db("turosed_turosed21"))
          {
            exit("Ошибка при доступе к базе данных");
          } 


          их надо закомментировать. (я их по ошибке оставил). Если не поможет, впишите туда свои параметры подключения к БД.
            • 26709
            • 4 Posts
            Quote from: [e
            Bu$ter link=topic=29853.msg181751#msg181751 date=1224593188]
            Ух ты, клёво! Спасибо, что поделились.
            Может, при положительных результатах тестирования, имеет смысл обратить на это внимание разработчиков?

            Можно было бы и разработчикам предложить, но насколько я понял, то в альфа-версии 2.0 уже есть такая возможность. Но еще незакончена. Но надеюсь, что при выходе релиза 2.0 это будет.
              • 24489
              • 60 Posts
              а ошибки вот:
              Error: fopen(/home/***/www/manager/includes/cachemysql/0e9c007ad0b057ecdd84770a5769d073.txt) [function.fopen]: failed to open stream: No such file or directory
              Error type/ Nr.: Warning - 2
              File: /home/***/www/manager/includes/cachemysql/cachemysql.php
              Line: 76
              Line 76 source: if (($file=fopen($filename, ’r’)) && filemtime($filename)>(time()-$valid)){

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

              пробывал менять проверки:

               /* Попытка чтения кэш-файла */
                    if ((@$file=fopen($filename, 'r')) && filemtime($filename)>(time()-$valid)){


              на
               /* Попытка чтения кэш-файла */
                    if (file_exists($filename) && filemtime($filename)>(time()-$valid)){
              		 @$file=fopen(@$filename, 'r');
              

              на 109 строке тоже так же, в итоге просто белый экран без ошибок. Не часто сталкиваюсь с тем, что при условии ошибка, на то оно и условие что бы ошибки ловить, "если файл читается то ЭТО если нет то ЭТО", а тут ошибка, странно как то.
                Плагин для ресайза картинок AutoResizer
                Сниппет для вывода полей документа DocInfo

                Создание ТВ типа checkbox/dropdown из списка дочерних документов tvsLinks
                • 26709
                • 4 Posts
                Попробуйте поковырять строку в файле \manager\includes\cachemysql\cachemysql.php
                //Путь к директории кэш-файлов
                   var $CachePath="./manager/includes/cachemysql/cache";   
                


                поставив там полный путь к каталогу с кешем. Должно работать.

                Что касается места, где идет запись кеша, то вот оно:
                      /* Запись кэша */
                      $file=fopen($filename, 'w');
                      flock($file, LOCK_EX);
                      fwrite($file, serialize($this->ResultData));
                      fclose($file);
                      return true;
                
                  • 24489
                  • 60 Posts
                  про создание файла я так и думал, так вот создание файла идёт ПОСЛЕ проверки "есть ли файл", по идее нужно наоборот.
                  про путь ставил от корня на сервере и по домену, результат один и тот же.
                    Плагин для ресайза картинок AutoResizer
                    Сниппет для вывода полей документа DocInfo

                    Создание ТВ типа checkbox/dropdown из списка дочерних документов tvsLinks
                    • 26709
                    • 4 Posts
                    Quote from: rariteth at Oct 23, 2008, 10:52 AM

                    про создание файла я так и думал, так вот создание файла идёт ПОСЛЕ проверки "есть ли файл", по идее нужно наоборот.
                    про путь ставил от корня на сервере и по домену, результат один и тот же.

                    Такой принцип используется, чтобы сравнивать копии файлов по дате. Сначала проверяется, есть ли файл кеша. Если есть, то с какой датой. Если дата устарела - идет перезапись, если дата актуальна, перезапись не идет. Таким образом ведется проверка актуальности кеша. Надеюсь, понятно объяснил smiley

                    Протестирую еще раз и доложу. Но у меня сейас все работает нормально
                      • 24489
                      • 60 Posts
                      отличный скрипт, применил уже на 3-х сайтах, на одном поставил время 432,000 секунд это 5 дней. хочу обратить внимание что файлы остаются их например на одном сайте уже 2,000, ща делаю чтобы запросы которые старше 15 дней удалялись, они же не используются получется. как посоветуете это сделать? и ещё - файл с проверкой изменлся ли контент, который подключается в индексе вставляет <!-- content --> как нипытался, но он искажает в ИЕ5-6 отображение, он ставить "<!-- content --> "в самом начале, это <Doctype /> переопределяет чтоли, стили короче едут, верстаю в блочной, поэтому какой дотайп довольно важно
                        Плагин для ресайза картинок AutoResizer
                        Сниппет для вывода полей документа DocInfo

                        Создание ТВ типа checkbox/dropdown из списка дочерних документов tvsLinks