Ага, на вложенных элементах процентовка шрифтов играла. Указал абсолютное значение.

В целом получше стало! Но http://joxi.ru/el2ZYMaPUgKamJ

В общих чертах верно. Но говорю же: разные цели - разные инструменты. У меня как правило все строится на выборках данных и все. А своя система процессоров позволяет менять логику централизованно. Если бы не было этой системы процессоров, то пришлось бы скорее всего использовать сами объекты, так как иногда нужна какая-то дополнительная логика, а она где-то должны храниться, чтобы всегда была на месте. Приведу пару небольших примеров. Вот довольно не маленький класс элемента (galItem - картинка) в компоненте Gallery. Что в нем есть?

  • Специфическая обработка метода get().
  • Удаление физического файла картинки при вызове remove(). И куча еще всего. Вот здесь или мы пишем все в сам класс, чтобы всегда можно было использовать, к примеру, $modx->getObject('galItem', $id)->get('relativeImage'), или пишем процессор, который будет получать чистые данные из БД и выполнять нужные действия. Для меня, к примеру, процессор предпочтительней. Он в 99.9% случаев будет работать быстрее. Но с объектами бывает удобнее работать. К тому же, если в объекте, к примеру, прописана специфическая обработка того же метода remove(), то откуда бы не вызвали удаление объекта, всегда этот метод будет отработан, даже если объект удаляется паровозом за связанными объектами.

Первый листинг выполняется в десятки раз быстрее, если я слишком примитивно сделал сравнения то поправьте, меня интересует производительность, скорость, гибкость, и т.д. и т.п.

провёл для себя эксперимент выявить каким способом быстрее достать данные, например достать id=185 и его tv параметр price0 привожу листинги кодов

  1. $begin_time = time() - 1272000000 + floatval(microtime());

$q1 = $modx->newQuery('modTemplateVarResource');

$q1->where(array('tmplvarid' => '19'));

$q1->select(array('modTemplateVarResource.*'));

$q1->limit(1000);

$q1->prepare();

$q1->stmt->execute();

$tvres = $q1->stmt->fetchAll(PDO::FETCH_ASSOC);

//print_r($tvres);

//-------resources------------

$q = $modx->newQuery('modResource');

$q->where(array(

'context_key' => 'web'

));

$q->select(array(

'modResource.*'

));

$q->limit(1000);

$q->prepare();

$q->stmt->execute();

$result = $q->stmt->fetchAll(PDO::FETCH_ASSOC);

$id = 185;//ресурс который ищем

foreach($result as $res){

if($res[id] == $id ){

    foreach($tvres as $tv){

        if($tv[contentid] == $id){

        echo $res[pagetitle] . "\n";

        echo $tv[value] . "\n";

        }

    }

}

}

$end_time = time() - 1272000000 + floatval(microtime()) - $begin_time;

echo $end_time; время потраченое 0.055360972881317 второй листинг 2) $begin_time = time() - 1272000000 + floatval(microtime());

$outHtmlAll='';

$modx->setLogLevel(3);

$namespace = 'shopmodx';

if(!$response = $modx->runProcessor('web/getdata',

array( "limit" => 1000

// Параметры

), array(

'processors_path'   => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',        

))){

print "Не удалось выполнить процессор";    

return;

}

$res0 = $response->getResponse();

//print_r($res0);

$id = 185;//ресурс который ищем

echo $res0[object][$id][pagetitle]. "\n";

echo $res0[object][$id][tvs][price0][value]. "\n";

$end_time = time() - 1272000000 + floatval(microtime()) - $begin_time;

echo $end_time . "\n"; время потраченое 0.47229799628258

По своему опыту могу сказать: стоит попробовать процессоры раз, и про сниппеты забудешь :)

Ваня уже в целом ответил. Да, главные минусы сниппетов (а getResources (здесь и далее подразумевается и getProducts, так как getProducts - это модифицированный getResources) - это сниппеты), что они возвращают только строковые результаты и что их нельзя расширять и т.п. Плюс к этому я бы еще добавил кое что:

  1. Рост кеша страницы. Сниппет и надо вызывать как сниппет, хоть он будет тегом прописан (и его потом MODX-парсер вызовет), хоть вы сами через $modx->runSnippet() вызовите. И прикол в том, что в любом случае кеш кода сниппета будет сложен в кеш страницы. В общих чертах про это писал здесь. В итоге даже при заходе на полностью кешированную страницу, даже если ничего выполняться не будет, инициируется довольно большой кеш-файл, который в итоге набивается в большой массив. А это потеря и времени, и ресурсов (в том числе памяти).
  2. getResources оперирует объектами, в то время как getdata-процессор только данными. В итоге разница в скорости и ресурсах в разы. Правда здесь минус getdata-процессора - не учитываются права на запрашиваемые данные (то есть если делать выборку документов из раздела, в котором часть документов - привилегированные, getResources выдаст только доступные документы, а getdata-процессор все документы). Но это тоже лечится. Здесь же выполняются выборки с учетом прав. Есть еще всякие мелочи, но не буду глубоко копаться.

да кстати замерил даную страницу http://developers.google.com/speed/pagespeed показывает Это время общее, включая пинг и т.п. А есть замеры на стороне самого сервера. Вот данные этой страницы: Memory: 13.0902 Mb TotalTime: 0.4274 s Но здесь хоть и не большая, но социальная сеть. Это один из крупнейших проектов, который приходилось делать (с учетом всех политик безопасностей, инфоблоков и т.п.). А средний корпоративный сайт или магазин вполне может работать быстрее. да наткнулся на сайты которые просто уговаривали кэшировать для того что бы сайт просто летал Берите на вооружение эту технологию :).

Я согласен, что появляются очень много зависимостей, и я уже с этим сталкнулся, так как одно изменение требует эти обновления и на других страницах. да наткнулся на сайты которые просто уговаривали кэшировать для того что бы сайт просто летал. Необходимо оптимизировать и переписать функционал всего сайта, что бы отказаться от кэширования, и по этому случаю, изучаю ваши разработки которые в основном не используют кэширование и хотелось бы иметь, неплохую документацию по вашим продуктам и в одном месте, да кстати замерил даную страницу http://developers.google.com/speed/pagespeed показывает По результатам тестирования время ответа вашего сервера составило 0,61 секунды Да и спасибо за быстрый отзыв на вопросы, и за комментарии и советы

Гибкость процессоров только в наследовании и том что он возвращает любой тип данных, а сниппет без танцев с бубнов всегда возвращает строку. А так по сути процессор это просто классы со стандартизированной в рамках MODX определенной логикой, в MODX их почему-то назвали именно так)