We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 29487
    • 385 Posts
    Интересно, откуда там 12 запросов? Вроде в сумме не набирается. Может ещё сниппеты есть, облако тегов например?

    1. Можно вообще запросы к базе к нулю свести.
    а) Закэшировать полностью все сниппеты, а на страницы разбивать плагином наподобие AutoSplitBigArticle. Просто каждые 10 элементов выводить какой-нибудь разделитель и по нему разбить на страницы. Текста там мало, страниц тоже немного - много памяти не должно занять.
    б) Убрать $this->db->connect(); в строке 1036 файла document.parser.class.inc.php
    Это попытка соединения с базой при каждом заходе на страницу, даже на кэшированную. Из стандартных сниппетов на эту процедуру болезненно реагирует только ajaxSearch, который нужно править.
    В файле dbapi.mysql.class.inc.php заменить функцию disconnect() на
    function disconnect() {
          if (!(empty ($this->conn) || !is_resource($this->conn))) {
             @ mysql_close($this->conn);
          }
       }


    2. Теперь память. Память жрут массивы aliasListing, documentListing и documentMap.
    Проще всего убить aliasListing.
    а) В файле cache_sync.class.processor.php убираем строчки
    $tmpPHP .= '$this->aliasListing = array();' . "\n";
    $tmpPHP .= '$a = &$this->aliasListing;' . "\n";
    

    и
    $tmpPHP .= '$a[' . $tmp1['id'] . ']'." = array('id' => ".$tmp1['id'].", 'alias' => '".$modx->db->escape($tmp1['alias'])."', 'path' => '" . $modx->db->escape($tmpPath). "');\n";

    б) В файле document.parser.class.inc.php
    меняем функцию rewriteUrls на
        function rewriteUrls($documentSource) {
            // rewrite the urls
            if ($this->config['friendly_urls'] == 1) {
                $in= '!\[\~([0-9]+)\~\]!ise'; // Use preg_replace with /e to make it evaluate PHP
                $isfriendly= ($this->config['friendly_alias_urls'] == 1 ? 1 : 0);
                $pref= $this->config['friendly_url_prefix'];
                $suff= $this->config['friendly_url_suffix'];
                $thealias= "array_search(\\1,\$this->documentListing)";
                $found_friendlyurl= "\$this->makeFriendlyURL('$pref','$suff',$thealias)";
                $not_found_friendlyurl= "\$this->makeFriendlyURL('$pref','$suff','" . '\\1' . "')";
                $out= "({$isfriendly} && {$thealias} ? {$found_friendlyurl} : {$not_found_friendlyurl})";
                $documentSource= preg_replace($in, $out, $documentSource);
            } else {
                $in= '!\[\~([0-9]+)\~\]!is';
                $out= "index.php?id=" . '\1';
                $documentSource= preg_replace($in, $out, $documentSource);
            }
            return $documentSource;
        }
    

    а в в функции makeUrl меняем
             elseif ($this->config['friendly_urls'] == 1 && $alias == '') {
                $alias= $id;
                if ($this->config['friendly_alias_urls'] == 1) {
                    $al= $this->aliasListing[$id];
                    $alPath= !empty ($al['path']) ? $al['path'] . '/' : '';
                    if ($al && $al['alias'])
                        $alias= $al['alias'];
                }
                $alias= $alPath . $this->config['friendly_url_prefix'] . $alias . $this->config['friendly_url_suffix'];
                $url= $alias . $args;
    

    на
            elseif ($this->config['friendly_urls'] == 1 && $alias == '') {
                $alias= $id;
                if ($this->config['friendly_alias_urls'] == 1) {
                    $al = array_search($id,$this->documentListing);
                    if ($al) {
                        /*$al_arr= explode('/',$al);
                        $alias = array_pop($al_arr);
                        $alPath= implode('/',$al_arr) . '/';
                        unset($al_arr);*/
                        $alias=$al; //no prefix
                    }
                }
                $alias= $alPath . $this->config['friendly_url_prefix'] . $alias . $this->config['friendly_url_suffix'];
                $url= $alias . $args;
    

    Если используются префиксы, нужно раскомментировать те 4 строчки. Но обычно префиксы не используются.
    Стандартные сниппеты и плагины на это реагируют безболезненно кроме SEO StrictURLs, который нужно править.


    Если на сайте всё самописное и не нигде не используются функции getParentIds и getChildIds, то можно пойти дальше и убить массив documentMap.
    Вместе с этими функциями. Нужно убрать из cache_sync.class.processor.php вывод массива $m и подправить условие на 345 строке парсера.
      • 18740
      • 9 Posts
      "Основное условие оптимизации: не меняем код системы, а пробуем через параметры и код используемых сниппетов решить вопрос нагрузки"
      Такая договоренность была с самого начала, давайте тогда я пробую сделать все что бы не трогать внутренности ModX, а после всех предложенных вариантов перейду на внутренний код. После каждого шага буду тестировать сайт на производительность, что бы можно было оценить уровень оптимизации.
      Сегодня я немного изменил настройки apache, надеюсь теперь вы сможете увидеть сайт.
        • 24272
        • 1 Posts
        А nginx никто не догадывался ставить? Обычно, это ненадолго помогает smiley, думаю, что при 100-300 одновременных заходах этого должно хватить...
          • 897
          • 1,620 Posts
          тут слишком долго php работает, да и памяти ест много. а какой размер файла assets/cache/siteCache.idx.php ?
            "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

            Не используйте Revo для "просто сайтов". Используйте Evo

            Who can defeat the Russian bear?
            • 895
            • 36 Posts
            Скорость дисков проверяли?
            eaccelerator включен/установлен?
            nginx в фонтенд поможет уменьшить кол-во процессов апача, как следствие освободит память.
            Ваше меню нельзя превратить в статику? или оно так часто меняется?
            Логи пишутся?
            Добавьте в единичные результаты ...LIMIT 1.
            Делайте unset.
              • 33568
              • 9 Posts
              Работаю над сайтом с большой нагрузкой.
              Большенство сниппетов самописные + использую свои таблицы.
              Но суть не в этом. Большая часть написанных снипеттов не кэшируется, со стороны modx, для актуальности данных.
              Чтобы снять нагрузку я сделал следующее: первым делом поставил ngix, потом в своих сниппетах сделал примитивное кэширование.
              Суть кэширования - сниппет смотрит в папку с кэшем и ищет файл с определенным именем (в зависимости от запроса), если файл нашелся - проверяется его дата создания и если все ок он его распаковывает и подгружает,
              если файла нет или он устарел (прошло больше часа со времени создания) - делаются необходимые запросы в базу и выводится на сайт, паралельно с этим готовая часть страницы (в html) архивируется и кладется в папку кэша.

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

              Если надо покажу пример кода, но там все просто.
                • 26744
                • 157 Posts
                Такой вопрос: статистика работы MySQL, PHP, количество запросов считается корректно даже если я использую самописные сниппеты и не использую API?
                Что-то у меня на всех страницах (почти на всех) один запрос.
                Размер кэша (пока еще не весь контент добавлен) - 270Кб. Это много?
                  • 785
                  • 2,113 Posts
                  Quote from: sergil at Aug 20, 2010, 09:31 AM

                  Такой вопрос: статистика работы MySQL, PHP, количество запросов считается корректно даже если я использую самописные сниппеты и не использую API?
                  Нет – если не используется API, надо в них добавлять учет статистики MySQL. При этом время работы PHP и общее время учитываются правильно.
                    Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                    Статьи о MODx, регулярно новые публикации
                    • 10967
                    • 24 Posts
                    Мне помогло на сайте где много контента: когда запускал поиск ajaxSearch и он выводил много результатов, PHx отваливался.
                    Для корректной работы PHx, при большом входных данных помогает заменить параметры в php.ini:
                    pcre.backtrack_limit=-1
                    pcre.recursion_limit=-1

                      • 25105
                      • 15 Posts
                      Quote from: AKots at Aug 25, 2009, 11:56 AM

                      Если кто-то захочет тоже создать базу из множества документов, рассказываю, как я это сделал.
                      1. Беру за основу сайт с одной страницей, полученный после установки MODx (без тестового сайта).
                      2. Делаю копию документа.
                      3. В копии меняю родителя на предыдущий документ.
                      4. Повторяю несколько раз, в результате получается вложенное дерево из четырех-пяти уровней, в каждом из которых только один документ.
                      5. В самом нижнем уровне делаю штук десять (или больше) копий страницы, оставляя того же родителя.
                      6. В предыдущем уровне делаю штук десять копий – каждый раз создается по сотне документов.
                      7. В предыдущем уровне делаю штук пять копий – каждый раз создается по тысяче документов.
                      8. В предыдущем уровне делаю нужное количество копий, проверяя, когда сайт сломается. В процессе работы меняю шаблон, чтобы меню не строилось по всем уровням.
                      9. С помощью Doc Manager ставлю флаг публикации на всех документах (может быть, лучше это делать при добавлении каждой порции).


                      А какая от этого выгода?