We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 27460
    • 13 Posts
    есть проэкт, в котор есть огромный каталог (~4000 товаров).. все бы ничего, если бы не 39 секундная генерация каждой из страниц.. решили сделать кэширование.. но что б закэшировать все, нужно по идеи открыть каждую страницу.. не вариант.. роботом - тоже не вариант (нагрузка на сервер будет ужасной).. поиски уже доступных решений для кэширования из админки пока не нашел (либо плохо искал). Решил написать маленький модуль. Функцию postProcess()вырезал из document.parser.class.
    function postProcess() {
            // if the current document was generated, cache it!
            if ($this->documentGenerated == 1 && $this->documentObject['cacheable'] == 1 && $this->documentObject['type'] == 'document' && $this->documentObject['published'] == 1) {
                $basepath= $this->config["base_path"] . "assets/cache";
                // invoke OnBeforeSaveWebPageCache event
                $this->invokeEvent("OnBeforeSaveWebPageCache");
                if ($fp= @ fopen($basepath . "/docid_" . $this->documentIdentifier . ".pageCache.php", "w")) {
                    // get and store document groups inside document object. Document groups will be used to check security on cache pages
                    $sql= "SELECT document_group FROM " . $this->getFullTableName("document_groups") . " WHERE document='" . $this->documentIdentifier . "'";
                    $docGroups= $this->db->getColumn("document_group", $sql);
    
    				// Attach Document Groups and Scripts
    				if (is_array($docGroups)) $this->documentObject['__MODxDocGroups__'] = implode(",", $docGroups);
    
                    $docObjSerial= serialize($this->documentObject);
                    $cacheContent= $docObjSerial . "<!--__MODxCacheSpliter__-->" . $this->documentContent;
                    fputs($fp, "<?php die('Unauthorized access.'); ?>$cacheContent");
                    fclose($fp);
                }
            }
    
            // Useful for example to external page counters/stats packages
            $this->invokeEvent('OnWebPageComplete');
    
            // end post processing
        }


    Но после этого начались грабли. (код сырой, просто проверяю или такое возможно)
    for ($id=1;$id<4;$id++){
    $basepath= $modx->config["base_path"] . "assets/cache";
                
                if ($fp= @ fopen($basepath . "/docid_" . $id . ".pageCache.php", "w")) {
                    // get and store document groups inside document object. Document groups will be used to check security on cache pages
                    $sql= "SELECT document_group FROM " . $modx->getFullTableName("document_groups") . " WHERE document='" . $id . "'";
                    $docGroups= $modx->db->getColumn("document_group", $sql);
    $homeDoc = $modx->getDocumentObject('id',$id);
    $title = $homeDoc['__MODxDocGroups__'];
    				// Attach Document Groups and Scripts
    				if (is_array($docGroups)) $title = implode(",", $docGroups);
    $array = $modx->getPageInfo($id,$id,'content'); $content = $array['content'];
                    $docObjSerial= serialize($homeDoc);
                    $cacheContent= $docObjSerial . "<!--__MODxCacheSpliter__-->" .$content;
                    fputs($fp, "<?php die('Unauthorized access.'); ?>$cacheContent");
                    fclose($fp);
       }        
    }


    замена $this->documentObject нашлась $modx->getDocumentObject(’id’,$id);

    а вот $this->documentContent; - незнаю чем заменить, хотя в АПИ расписано, что оно возращает [*content*] страницы, но судя по файлах кэша должно возвращать полную сгенерированую страницу.

    может кто-то помочь с этим? либо есть какие-то другие готовые решения?
      • 785
      • 2,113 Posts
      Не совсем понятно, что хотите сделать, поясните задачу (что должен делать модуль), а не приводите какие-то куски кода. В любом случае, 39 секунд на генерацию страниц – нереально много, что-то сделано неправильно.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 27460
        • 13 Posts
        Quote from: AKots at Sep 05, 2009, 05:41 AM

        Не совсем понятно, что хотите сделать, поясните задачу (что должен делать модуль), а не приводите какие-то куски кода. В любом случае, 39 секунд на генерацию страниц – нереально много, что-то сделано неправильно.

        я хочу сделать ручное кэширование целого сайта из админки..
        до того, как импортировал приблизительно 4000 страниц из csv, все работало нормально..

        вот сам проэкт http://anna.demoversion.org.ua/

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

        так же, у меня есть подозрения на счет Wayfinder, посколько он формирует меню..
          • 785
          • 2,113 Posts
          Quote from: Skakruk at Sep 05, 2009, 06:28 AM

          я хочу сделать ручное кэширование целого сайта из админки..
          Простые расчеты показывают, что для кэширования 4000 страниц, если на каждую тратится 39 секунд, понадобится 43 часа. Сначала надо оптимизировать страницы, отказавшись от ресурсоемких сниппетов или изменив их вызовы. Например, если Wayfinder генерирует меню из 4000 страниц, однозначно будут огромные задержки.
            Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
            Статьи о MODx, регулярно новые публикации
            • 27460
            • 13 Posts
            та не.. Wayfinder генерирует меню не из всех документох, только категории, которых не больше 50-ти..

            но все равно спасибо за наводки)
              • 27460
              • 13 Posts
              экспериментальным путем я все же установил, что же так долго генерируется..
              оказалось, что всему виной таки Вейфайндер, но не тот, что генерирует меню, а тот что создает "хлебные крошки"
              [[Wayfinder? &startId=`0` &config=`[%lang%]breadcrumb` &ignoreHidden=`true`]]