Василий Наумкин

Василий Наумкин

С нами с 08 декабря 2012; Место в рейтинге пользователей: #1
Василий Наумкин
07 апреля 2015, 15:05
0
Ну а как еще можно указать сниппету список ресурсов, которые прошли фильтр?

Я не знаю таких способов, только простыня из подходящих id.
Василий Наумкин
07 апреля 2015, 14:22
0
На странице 2 лога, один от mFilter2, а второй от msProducts


И они оба обновляются при работе через ajax. Если там те же полторы секунды, то проблема явно не в этих дополнениях.
Василий Наумкин
07 апреля 2015, 13:47
0
Ну вот ты лог с обычной загрузки страницы показал. Что мешает показать лог работы сниппетов при загрузке через ajax?

Они тоже выводятся на страницу. Может у тебя там сторонний какой плагин реагирует на ajax запрос, может еще что-то, нужно разбираться.

Сам по себе ajax должен быть быстрее, потому что грузится не целая страница, а только нужный кусок контента. Его для того и придумали — чтобы ускорять.
Василий Наумкин
07 апреля 2015, 09:56
+1
Я использовал пример топикстартера.

Наверное, ему удобнее так подсчитывать время и ОЗУ, да и условия замеров должны быть одинаковыми.
Василий Наумкин
07 апреля 2015, 09:55
+2
Это не ответ на твой вопрос?
А теперь отвечу на твой вопрос:
Однако, как я понял, изучение и применение чистого xPDO в своих разработках серьёзно поможет снизить нагрузку на сервер, ведь верно?
Да, конечно. Нужно учить и xPDO, и PDO, и PHP, и MySQL, и еще много всего. Любые библиотеки, фреймворки и прочие вспомогательные инструменты — это надстройки над чем то, и они в принципе не могут быть быстрее этого чего то. Так что, основы нужно знать всегда.

Разница между чистым xPDO и pdoTools в дополнительном функционале последнего. Если он тебе не нужен — не используй.

При этом дополнительный функционал можно включать по желанию, чтобы подобрать для себя оптимальное соотношение скорости и удобства.

У pdoTools есть еще одно хорошее качество — это определённая стандартизация функционала, чего нет у других разношерстных решений.
Если сниппет использует pdoTools, ты обычно можешь рассчитывать на выборку по родителям, INLINE чанки, подключение и фильтрацию ТВ и другие его общие функции.
Василий Наумкин
07 апреля 2015, 09:07
+1
Затем, что я привёл сравнение к одинаковому функционалу. Если не нужны дополнительные навороты из pdoTools — незачем его и использовать.

Однако, к моему коду можно легко добавить выборку ТВ параметров с обработкой, фильтрацию по родителям на определённой глубине с исключением определённых id и еще много всякого:
$pdo = $modx->getService('pdoFetch');
$pdo->setConfig(array(
	'select' => 'id,uri,pagetitle,content',
	'includeTVs' => 'Date,List',
	'processTVs' => 1,
	'parents' => '5,-10',
	'depth' => 2,
	'limit' => 2000
));
$pdo->makeQuery();
$pdo->addTVs();
$pdo->addJoins();
$pdo->addSelects();
$pdo->addWhere();
$query = $pdo->prepareQuery();
$pdo->addTime('SQL prepared <small>"'.$query->queryString.'"</small>');
$query->execute();
echo '<pre>';print_r($pdo->getTime());echo '</pre>';

Лог работы:
0.0000291: xPDO query object created
0.0006900: Included list of tvs: Date, List
0.0026941: leftJoined modTemplateVarResource as TVdate
0.0002470: leftJoined modTemplateVarResource as TVlist
0.0001659: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `uri`, `pagetitle`, `content`
0.0000451: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `Date`
0.0000069: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `List`
0.0010350: Processed additional conditions
0.0013552: Added where condition: modResource.parent:IN(5,10,14,49,51,11,12,13,50,52,53,11,12,13), modResource.parent:NOT IN(10)
0.0000041: Limited to 2000, offset 0
0.0000980: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`uri`, `modResource`.`pagetitle`, `modResource`.`content`, IFNULL(`TVdate`.`value`, '') AS `Date`, IFNULL(`TVlist`.`value`, '') AS `List` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_site_tmplvar_contentvalues` `TVdate` ON `TVdate`.`contentid` = `modResource`.`id` AND `TVdate`.`tmplvarid` = 2 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVlist` ON `TVlist`.`contentid` = `modResource`.`id` AND `TVlist`.`tmplvarid` = 1 WHERE  ( `modResource`.`parent` IN (5,10,14,49,51,11,12,13,50,52,53,11,12,13) AND `modResource`.`parent` NOT IN (10) )  LIMIT 2000 "
0.0056591: Total time
4 718 592: Memory usage

Покажи пожалуйста, насколько меньше строк будет в твоей реализации на чистом xPDO.
Василий Наумкин
07 апреля 2015, 07:46
0
Ничего, что работа с suggestions не менялась с версии 0.6.0-beta? Это объективный факт.

У mFilter2 есть свой лог, где показано, сколько времени генерируются предсказания результатов. Без них, конечно, всегда быстрее.
Василий Наумкин
07 апреля 2015, 07:35
0
Да, еще пару недель назад, потому что верстку ломает при больших ветках.

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

Считаешь, нужно вернуть эту надпись?
Василий Наумкин
07 апреля 2015, 07:00
+1
Конечно, pdoTools не может работать быстрее, чем сам PDO, но сравнение твоё совсем не корректно.

Если уж ты используешь минимум фукнций xPDO, то давай сравним вот так:
$pdo = $modx->getService('pdoFetch');
$pdo->setConfig(array(
	'select' => 'id,uri,pagetitle,content',
	'limit' => 2000
));
$pdo->makeQuery();
$pdo->addSelects();
$query = $pdo->prepareQuery();
$query->execute();
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
	print $row['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
0.0129349: Total time
6 029 312: Memory usage

А теперь твой xPDO пример, в котором добавлен вызов getSelectColumns, чтобы было по-честному:
$pdo = $modx->getService('pdoTools');
$q = $modx->newQuery('modResource');
$q->select($modx->getSelectColumns('modResource', 'modResource', '', array("id","uri","pagetitle","content")));
$q->limit(2000);
$s = $q->prepare();
$s->execute();
while($row = $s->fetch(PDO::FETCH_ASSOC)) {
	print $row['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
0.0127289: Total time
5 767 168: Memory usage

И внезапно, скорость и потребление памяти практически идентичны! Циферки больше, потому что проверял на сервере h1, а не h3.

Никто не заставляет тебя использовать все методы pdoFetch, можно выбирать только нужные.

Если уж на то пошло, то вот абсолютный лидер по всем параметрам, включая количество строк:
$pdo = $modx->getService('pdoTools');
$q = $modx->prepare("SELECT `id`, `uri`, `pagetitle`, `content` FROM modx_site_content LIMIT 2000");
$q->execute();
while($row = $q->fetch(PDO::FETCH_ASSOC)) {
	print $row['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
0.0090590: Total time
4 980 736: Memory usage

А теперь отвечу на твой вопрос:
Однако, как я понял, изучение и применение чистого xPDO в своих разработках серьёзно поможет снизить нагрузку на сервер, ведь верно?
Да, конечно. Нужно учить и xPDO, и PDO, и PHP, и MySQL, и еще много всего. Любые библиотеки, фреймворки и прочие вспомогательные инструменты — это надстройки над чем то, и они в принципе не могут быть быстрее этого чего то. Так что, основы нужно знать всегда.

pdoTools был моим ответом на претензии в духе «MODX Revolution тормозной!!!111». Насколько я вижу, таких криков в интернетах сегодня почти нет. А тем, кто жалуется на Revolution, первым делом советуют попробовать pdoTools.

Ну и на закуску, попробуй в своей выборке подключить пару ТВ параметров и вывести их в обработанном виде, чтобы картинка тегом, а файл с полным путём от корня источника медиа — а потом сравни, насколько это будет сложнее, чем просто указать:
'includeTVs' => 'image,file',
'processTVs' => 1,
Василий Наумкин
06 апреля 2015, 22:37
0
Делай, конечно, раз не устраивает фильтрация 16 тысяч товаров за полторы секунды.
Василий Наумкин
06 апреля 2015, 22:23
0
Да, скорее всего.

Фильтр подбирает подходящие ресурсы и отдаёт их id в msProducts, а тот уже выводит.
Василий Наумкин
06 апреля 2015, 21:47
0
Если не устраивает работа стандартного сниппета — пиши свой сниппет, с более оптимальным SQL запросом.

Начать стоит с EXPLAIN SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS `msProduct`.`id`…
Василий Наумкин
06 апреля 2015, 21:43
0
Ты что, человек ЦЕЛЫЙ ЧАС ПОТРАТИЛ, понимать надо!

Сколько времени на подготовку дополнения потратил ты — никого не волнует.
Василий Наумкин
06 апреля 2015, 19:31
0
Нужно заменить
&bcTplCrumbOuter=`[[$bcTplCrumbOuter_2]]`
на
&bcTplCrumbOuter=`bcTplCrumbOuter_2`
Василий Наумкин
05 апреля 2015, 20:34
+3
Так прописано в модели дополнения, это хорошо видно в схеме, по которой она генерируется.

Почитать можно здесь. А про работу с джоинами pdoTools — здесь.
Василий Наумкин
05 апреля 2015, 20:27
0
Проверял для гостей, без авторизации
Логично, у гостей нет профиля на сайте, а именно он выбирается.

наверное перекрывают друг друга
Tickets изначально не рассчитывался на работу без авторизации. Потом я это дописал, но не везде, как видно.
Василий Наумкин
05 апреля 2015, 19:39
0
Неправильный ты вывод делаешь.

Скорее всего, из-за особенностей работы плейсхолдеров, фильтр применяется к тегу, когда он еще пуст. А когда ты убираешь md5 и страница ренедрится полностью, email туда успевает подставиться. То есть, значение в тег попадает уже после обработки фильтром.

Можно попробовать вызывать его просто некэшированным [[!+email:md5]].

Исходник фильтра в MODX выглядит так:
case 'md5':
	/* See PHP's md5 - http://www.php.net/manual/en/function.md5.php */
	$output= md5($output);
break;
Ошибаться там просто негде.
Василий Наумкин
05 апреля 2015, 19:30
0
Отдельно нет.
pdoTools — специальная библиотека, и все сниппеты работают исключительно с её помощью.

Её используют miniShop2, mSearch2, Tickets, BannerY и другие дополнения. Думаю, тебе придётся постараться, чтобы не установить pdoTools рано или поздно себе на сайт =)