есть проэкт, в котор есть огромный каталог (~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*] страницы, но судя по файлах кэша должно возвращать полную сгенерированую страницу.
может кто-то помочь с этим? либо есть какие-то другие готовые решения?