Интересно, откуда там 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 строке парсера.