Василий Столейков

Василий Столейков

С нами с 19 декабря 2012; Место в рейтинге пользователей: #25
Отправить деньги
Волков Николай
11 ноября 2017, 01:03
1
-1
Господи, я выводил в админке таблицы, когда в сумме было более 600 000 позиций и что?

Еще раз: ОЧЕНЬ большое значение играют сервера (особенно MySQL), а также ОЧЕНЬ большую роль играет то, как была расширена стандартная схема для msProductData, в особенности индексы. Далее все зависит от ситуации. Банально кто-то мог делать замеры в тот промежуток времени, на которой приходится пик посещаемости…

Также нельзя забывать про тонны дерьма, которое установлено может быть в браузере или самом компьютере. Все различных шпионских преблуд сейчас выше крыши. И под шпионскими я подразумеваю не то, что за вами следят из НАТО по личной просьбе Трампа. Нет, ему на вас скорее всего по *&#… А вот тем, кто занимается рекламой, наоборот. И если в Google имеются программисты достаточно высокого уровня, которые это все умудряются делать незаметно, то какой-нибудь Mail Group со своими спутниками и прочим убожеством реализует так, что у антивируса могут возникнуть логичные вопросы и пока он будет разбираться, затянется в итоге все это мероприятие.
Года два назад я перенастроив и удалив кое-что из skype получил на всех сайтах прирост скорости. Хоть и не 1-2с. Но тем не менее 30 подобных skype и порядка 1с было бы…

Далее нельзя забывать про такую вещь, как физика. Если вы находитесь в Санкт-Петербурге, а сервера расположены на Сахалине, то надеюсь понятно, что току потребуется время для преодоление такого расстояния. Более того, оно как минимум на два умножается, т.к. складывается время для запроса к серверу ОТ вас и для ответа от сервера К вам. В примере с Сахалином получается, что обогнуть все Землю. Поскольку админка загружается асинхронно, то запросов будет много и, соответственно, сложно представить сколько раз всю Землю обежит ток до финального вывода таблицы.

Но математика, как минимум, покажет что для вдвое близких точек, потребуется в 4 раза меньше времени для 1 запроса. Соответственно, скорость загрузки будет расти, как 2 в степени определенной…

Продолжать можно еще очень долго, но суть надеюсь понятна…
Володя
09 ноября 2017, 10:45
2
+4
написать сниппет например next_wday
<?php

/** @var modX $modx */
/** @var array $scriptProperties */

//Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
$wday = $modx->getOption('wday', $scriptProperties, 'Friday', true);
$format = $modx->getOption('format', $scriptProperties, 'd.m.Y', true);
if (date('w') >= date('w', strtotime($wday))) {
    $date = date($format, strtotime("next ".$wday));
}
else {
    $date = date($format, strtotime($wday));
}

return $date;
вызываем как
{'next_wday'|snippet:[
'wday' => 'Friday',
'format' => 'd.m.Y'
]}
Василий Наумкин
07 ноября 2017, 00:29
3
+9
Ребята, у всех «зависающих» одна и та же проблема — баг в 2.6 с очисткой кэша ресурса, если он был получен через getOne или подобный метод. Вот простейший код, который генерирует ошибку.

Все уже в курсе, будет починено в 2.6.1. Вот исправление, которое можно сделать самостоятельно.
Волков Николай
20 октября 2017, 00:27
1
+2
jquery.com/upgrade-guide/3.0/#deprecated-document-ready-handlers-other-than-jquery-function

В общем, начиная с 3 версии в jQuery иначе реализовано многое и я сталкивался со случаями, когда не работает:
$(document).ready(function() {
Если я не ошибаюсь, то все из-за того, что раньше ready был event, а сейчас это Promise. Лично я пишу так:
$.when($.ready).then(function(){...});
Василий Наумкин
11 октября 2017, 10:28
2
+1
Нужно.

Причём, писать лучше массивом, потому что сейчас у тебя там JSON с ошибкой:
'includeTVs' => 'searching',
'where' => [
	'searching' => 1, 
	'Status.value:IN' => ['', 0, 2],
],
Тоже самое касается и join — все сниппеты pdoTools давно понимают указание массивов через Fenom.
Сергей Шлоков
15 сентября 2017, 12:06
1
+2
Вообще, логику в чанках лучше не определять. Если рассматривать MODX с точки зрения MVC концепции (насколько это возможно), то чанк — это вид. И среди программистов не принято в видах прописывать логику. Для этого есть контроллеры. В MODX это лучше делать в плагинах
// Плагин
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
            $fenom->addAccessorSmart("product", "data", Fenom::ACCESSOR_PROPERTY);
            $fenom->data = [
                "name" => '', // Тут имя определяете по вашему условию
            ];
    break;
}
А в чанке просто вызывать
Фильтры для {$.product.name}
Роман Ильин
12 сентября 2017, 23:09
12
+2
Сниппет для удаления старых версий:

<?php
/**
 * versionCleanX
 *
 * @author Scott Pronych, September 27, 2013
 *
 * DESCRIPTION
 *
 * For use with VersionX to delete old content
 *
 * PROPERTIES:
 *
 * &contentType - can be resource, chunk, plugin, snippet, template, or templatevar
 * &maxVersions - integer value for max number of versions you would like to keep
 *
 * USAGE:
 *
 * [[!versionCleanX? &contentType=`resource` &maxVersions=`10`]]
 *
 */
 
$cx_type = $modx->getOption('contentType', $scriptProperties, 'resource');
$cx_max = (int) $modx->getOption('maxVersions', $scriptProperties, 5);
 
$GLOBALS['count'] = 1;
$GLOBALS['total'] = 0;
$GLOBALS['deleted'] = 0;
$GLOBALS['page_total'] = 0;
$GLOBALS['page_deleted'] = 0;
$GLOBALS['page_name'] = '';
$GLOBALS['prev_content_id'] = 0;
$GLOBALS['prev_version_id'] = 0;
 
switch ($cx_type) {
    case 'chunk':
        $name = 'name';
        break;
    case 'plugin':
        $name = 'name';
        break;
    case 'snippet':
        $name = 'name';
        break;
    case 'template':
        $name = 'templatename';
        break;
    case 'templatevar':
        $name = 'name';
        break;
    default:
        $name = 'title';
        $cx_type = 'resource';
}
 
$GLOBALS['db_name'] = 'modx_versionx_' . $cx_type;
 
function delete_row ($id) {
    global $modx;
    $query = "DELETE FROM `" . $GLOBALS['db_name'] . "` WHERE version_id = '" . $id . "'";
    $result = $modx->query($query);
    if (!is_object($result)) return false;
    else {
        $GLOBALS['deleted']++;
        $GLOBALS['page_deleted']++;
        $GLOBALS['page_total']++;
        $GLOBALS['total']++;
        $GLOBALS['count']++;
        return true;
    }
}
 
function log_row () {
    $GLOBALS['data'] .= '<tr><td>' . $GLOBALS['page_name'] . '</td><td>' . $GLOBALS['page_total'] . '</td><td>' . $GLOBALS['page_deleted'] . "</td></tr>\n";
    $GLOBALS['page_deleted'] = 0;
    $GLOBALS['page_total'] = 1;
    $GLOBALS['count'] = 1;
}
 
$query = "SELECT version_id, content_id, " . $name . " AS page_title FROM `" . $GLOBALS['db_name'] . "` ORDER BY content_id ASC, version_id DESC";
 
$GLOBALS['data'] = '';
$output = 'An error occurred: ';
$versionx = $modx->query($query);
if (!is_object($versionx)) {
   return $output . 'query error ' . print_r($modx->errorInfo(), true);
}
else {
 
while($row = $versionx->fetch(PDO::FETCH_ASSOC)) {
    // New content_id so reset
    if ($prev_content_id == 0) {
        $prev_content_id = $row['content_id'];
        $prev_version_id = $row['version_id'];
        $GLOBALS['total']++;
        $GLOBALS['page_total']++;
        $GLOBALS['count']++;
        $GLOBALS['page_name'] = $row['page_title'];
    }
    elseif ($prev_content_id != $row['content_id']) {
        if ($GLOBALS['count'] > $cx_max) {
            if (!delete_row($prev_version_id)) return $output .  'deleting row for ' . $GLOBALS['page_name'] . ' Row: ' . $prev_content_id . ' ' . print_r($modx->errorInfo(), true);
            $GLOBALS['page_total']--;
 
        }
        else {
            $GLOBALS['total']++;
            $GLOBALS['count']++;
        }
        log_row();
        $prev_content_id = $row['content_id'];
        $prev_version_id = $row['version_id'];
        $GLOBALS['page_name'] = $row['page_title'];
    }
    // Content count is over the max so delete previous row
    elseif ($GLOBALS['count'] > $cx_max) {
            delete_row($prev_version_id);
            $prev_content_id = $row['content_id'];
            $prev_version_id = $row['version_id'];
    }
    else {
        $GLOBALS['count']++;
        $GLOBALS['page_total']++;
        $GLOBALS['total']++;
        $prev_content_id = $row['content_id'];
        $prev_version_id = $row['version_id'];
    }
}
log_row();
 
if ($GLOBALS['data'] != '') {
$output = '<h3>VersionX Cleanup for ' . $GLOBALS['db_name'] . '</h3>
<p>Total records: <strong>' . $GLOBALS['total'] . '</strong>
Total deleted: <strong>' . $GLOBALS['deleted'] . '</strong></p>
<table class="table table-striped">
<thead>
<tr>
<th>Page name</th>
<th>Total found</th>
<th>Deleted</th>
</tr>
</thead>
<tbody>
' . $GLOBALS['data'] .  '</tbody></table>
';
}
else $output = 'Error: no data found.';
}
 
$query = "OPTIMIZE TABLE `" . $GLOBALS['db_name'] . "`";
$versionx = $modx->query($query);
if (!is_object($versionx)) {
   $output = 'Optimize error ' . print_r($modx->errorInfo(), true) . $output;
}
 
return $output;


Вызывать так:
[[!versionCleanX? &contentType=`resource` &maxVersions=`10`]]
Василий Наумкин
01 сентября 2017, 10:11
1
+1
1. Быстрый ответ от PHP
2. Настроенный веб сервер (gzip, кэширование статики)
4. Оптимизированные картинки (не только сжатие, но и соответствие размеров в css реальному размеру картинки)
5. Оптимизированные скрипты и стили

Лично я не заморачиваюсь с подключением скриптов и стилей inline ради циферок от Google, просто размещаю ссылки на css в шапке, а javascript в подвале — как обычно.
Володя
01 сентября 2017, 09:53
4
+3
Тема очень обширна и возможны разные варианты. Можно использовать различные сборщики, например тут Василий описал детально сборку с помощью gulp. Кто то использует minifyx.

Могу поделиться своим решением на основе html-compressor.

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

Способ не идеален, так как требует обработки страницы на стадии рендера и это конечно минус, но задержки не так велики. Пакет находится в стадии тестирования, но результаты примерно такие



я ни кого не призываю использовать этот пакет, просто делюсь способом оптимизации.

ps. кстати данный пакет подключен и тут s6200.h3.modhost.pro/6/12010.html
но там нет оптимизации картинок потому результат не 100…

Василий Наумкин
08 августа 2017, 17:12
3
0
$(doсument).on('ready', function() {
	miniShop2.Message = {
		success: function() {},
		error: function() {},
		info: function() {},
	};
});
Я не имел в виду, что нужно прям свой файл загрузить после, хотя и так можно. Нужно просто перезаписать часть скрипта miniShop2 перед его первым использованием.