We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 33694
    • 742 Posts
    Товарищи, кто ковырял парсер, объясните пожалуйста в чём фишка.

    document.parser.class.inc.php, первые строки функции outputContent()
    $this->documentOutput= $this->documentContent;
    
            // check for non-cached snippet output
            if (strpos($this->documentOutput, '[!') > -1) { 
                $this->documentOutput= str_replace('[!', '[[', $this->documentOutput);
                $this->documentOutput= str_replace('!]', ']]', $this->documentOutput);
    
                // Parse document source
                $this->documentOutput= $this->parseDocumentSource($this->documentOutput);
            }
    

    Из кода видно, что парсер заменяет некешируемые вызовы снипетов обычными — кешируемыми. И это прямо перед их обрабокой (вызвом parseDocumentSource()). Как это понимать правильно?

    Для справки: outputContent() вызывается через prepareResponse() прямиком из executeParser() (в самом конце). Т.е. это в процесе формировния выходного документа.

    Предположил, что разгадка находится где-то в области процесса сохранения уже сгенерированной страницы в кэш, и загрузки её от туда. Т.е. только кеш генерируется по хитрому, а обрабатывается всё одинково. Но поверхностный осмнор ответственных за это функций, предположение не подтвердил, а дал поводу думать, что разница между вызовом [!некешируемый сниппет!] и [[кешируемый сниппет]] только в том, что за время генерации страницы некешируемый сниппет будет выполняться столько раз, сколько он взывается, а кешируемый — только одина раз – самый первый вызов. Но позже выяснилось, что в любом случае выполняться они будут каждый раз, когда их встретит парсер, а вот из базы повторно запрашиваться будут только некешируемые.
    Спрашивается: зачем повтороно запрашивать сниппет из базы во время генерации страницы, когда он мог успеть измениться?

    И всё таки, чувствую, недокопал я до конца. Ведь, при вкюченном кешировнии количество запросов к базе обычно равно нулю. Т.е. сниппеты всё таки от туда не берутся. А в каком тогда месте сохраняются результаты их работы? Если кто знает, неполенитесь, укажите пожалуйста место в коде.

    P.S. MODx 0.9.5-6
      • 897
      • 1,620 Posts
      ну так если вызов сниппета некэшируемый он просто в эту обработку не попадет.

      а сниппер который кэшируется при первом вызове отработает и ляжет вместе со страницей в кэш.
        "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

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

        Who can defeat the Russian bear?
        • 31213
        • 153 Posts
        Насколько мне известно сниппеты берутся из кэша /assets/cache/siteCache.idx.php всегда. Другое дело, что результат их работы может как кэшироваться ([!...!]), так и не кэшироваться ([[...]]).