Николай Ланец
12 июня 2013 г., 3:42

Перенос большого магазина с MODX Evolution на MODX Revolution

Сразу отмечу, что этот топик — начало цикла статей, в которых я буду описывать реальный опыт переноса большого магазина с Эво на Рево, так что не редко темы будут казаться не законченными, продолжение в новых топиках.
Начали разработку нового крупного магазина, точнее перенос имеющегося с MODX Evolution на MODX Revolution с полным обновлением функционала и дальнейшей его доработкой.
Исходные данные: интернет-магазин на 31 000 товаров (документов), 275 000 TV-параметров (MODX Evolution).
Наверняка многих заинтересует информация по объему кеша и т.п. Так вот, размер кеш-файла — почти 10 метров. При этом сейчас переношу копию сайта на modxcloud.com (да, там и Эво-сайты можно разворачивать, как и любые другие, это же просто хостинг, просто плюшки под Рево всякие). Так вот, сайт просто не запустился. Причина? 128 метров памяти, выделенных под php, не хватает этому сайту даже для запуска. Критической ошибкой о нехватке памяти разваливается на 75000-ой строке (всего в кеше порядка 100 000 строк). А ведь это пока еще чтение кеша. Какого-то объема памяти еще понадобилось бы MODX-у на полную обработку запроса. Помогло только ручное удаление часть кеша. Тогда сайт запустился. Но теперь кеш очищать нельзя, а то опять сайт развалится :-)
По поводу производительности данного сайта: среднее время открытия страницы: 1-2 сек., поиск по каталогу несколько секунд, не редко больше 10-ти секунд.
Перенос сайта.

Перенос на Рево выполнял уже обкатанным методом: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/89.html
На выходе мы уже имеем все исходные шаблоны, TV-параметры, сниппеты, чанки и т.п. Файлы картинок и т.п. мы просто копируем из папки старого сайта, благо картинки находятся как положено в assets/images/.
Обновление УРЛ-ов.

Первая сложность здесь — это обновление УРЛ-ов документов. В MODX Evo не было такого поля в документах, как uri, то есть система УРЛов в Эво и Рево отличается. После переноса контента с Эво, колонка uri в modx_site_content у нас пустая, то есть адрес страница как бы и не имеет. Наша задача здесь — обновить УРЛы документов. Эту процедуру я описывал здесь: modxclub.ru/blog/dokumentatsiya-dlya-spetsialistov/90.html
Кстати, сразу отмечу, что при большом количестве документов имеет смысл поставить cacheOptimizer и отключить кеширование карты ресурсов как минимум на время проведения этой операции, так как процедура и без того тяжелая, а плюс к этому MODX при очищении кэша будет пытаться сгенерировать всю карту ресурсов занова, и сервер будет плакать. При этом процедура обновления тогда будет отличаться (то есть скрипт отличаться). Дело в том, что при отключенной карте ресурсов при обновлении uri ресурса MODX, способен разобраться только с uri текущего ресурса, но не может обновить uri дочерних ресурсов, так как для них он пытается uri получить из карты ресурсов, а ее у нас нет. То есть за раз обновляет только один документ. Так что лимиты в скрипте получения документов без uri надо устанавливать больше. То есть сколько получит документов, столько и попытается за раз обновить. При этом выполняется относительно быстро (1000 документов обновляет где-то за минуту-полторы). Вот скрипт:
<?php $modx->setLogLevel(1); ini_set('max_execution_time', 3200); ignore_user_abort(true); $q = $modx->newQuery('modResource', array( 'uri' => null, )); $q->select(array( 'modResource.*', )); $q->limit(1000); $q->sortby('id'); $s = $q->prepare(); $s->execute(); foreach ($s->fetchAll(PDO::FETCH_ASSOC) as $data) { $modx->error->reset(); $modx->runProcessor('resource/update', $data); } print "ok";
Относительно кеша мы еще поговорим дальше не раз.
Все, обновил все 30000+ документов. Часа 2 заняло. Само собой не все два часа я трудился, просто время от времени скрипт перезапускал. После всей этой процедуры имеет смысл полностью очистить папку кеша по ряду причин.
Проблема два — большой файл кеша.

После полного прогона УРЛов и генерации файла кеша с картой ресурсов, файл кеша весит почти 5 метров, а php требует для свой работы 36 метров с ходу. Это конечно меньше, чем Эво желает, но все равно не айс. Тем не менее, у нас есть пространство для маневров: ведь основной фишкой Рево-2.2.7 была как раз возможность частичного отключения кеширования карты ресурсов (системная настройка cache_alias_map). Сейчас ей и воспользуюсь, то есть отключу ее. Результат: кеш файла сократился до 700 кило, а потребление памяти до 10-ти метров. Результат очевидный!
В общем, проблема с кешем тоже решена (10 метров против 156-ти, по-моему очень хороший результат). Кто там говорил, что Эво легкая, а Рево тяжелая? Всегда говорил — голая Рева конечно тяжеловатая, но она горизонтально масштабируется, а Эва вертикально. Все, что вешается на Эво, все сверху ложится, а в Рево можно аккуратно по полкам разложить. Это я еще не проводил тюнинг, ведь и документы можно раскидать по разным контекстам, так, что кеш еще в разы упадет. Но пока это не требуется.
На сегодня все. Много всего интересного еще будет в следующих топика. Это, так сказать, начало еще.
Спасибо за материал. Интересно было бы знать версию Evo, на которой был сделан изначальный магазин. А также - принимались ли какие-либо меры по оптимизации кеша разработчиками изначального магазина (того, что на Эво)?
Эво 1.0.5 была. И там с кешем особо сделать ничего нельзя было, ибо Эво весь свой кеш хранит в едином файле. Я не думаю, что даже в последних версиях Эво что-то принципиально новое с системой кеширования сделали, чтобы он мог тянуть несколько десятков тысяч документов просто так.
Сейчас и в Evo можно провернуть трюк с частичным отключением карты ресурсов.
Вот было бы прикольней, если бы обходилось без трюков. Но справедливости ради отмечу, что хоть в Рево частичное отключение карты доступно из коробки и просто настройкой выключается, на крупных ресурсах все-таки этого часто бывает не достаточно, ибо собрать в эту карту 100 000 ресурсов, к примеру - задача часто невозможная, то есть после сброса кеша сайт просто разваливается. На таких сайтах у нас без cacheOptimizer не обходится.
Холиварить, я, конечно, не собирался. Передо мной стоит другая задача. Медленно, но верно у меня зреет проект регионального сайта недвижимости. В общем-то, стандартный сайт, его особенность разве что в некоторых чисто маркетинговых нюансах подачи УТП сайта. Я даже понемногу делаю прототип, на котором отрабатываю идеи юзабилити и понимаю встречающиеся трудности. Для реализации прототипа избрал Эво по по причине её изящества и минимального "входного порога" знаний. И заранее начинаю думать - на чем реализовывать продакшн? Эво или Рево? И если Рево - насколько лёгким будет дальнейший переход? P.S. Объекты пока реализованы в дереве документов, их, наверное, потом придётся переносить в свои таблицы. Число объектов предполагается... ну... максимум 5000, но ведь вы прекрасно понимаете, что при успешном старте проекта эти 5000 могут вылиться и 10, и в 20000, как вы совершенно резонно заметили в одном из своих топиков. Вот и думаю.
Холиварить и я не буду. Но скажу просто: будете делать на Эво, не придется рассчитывать на помощь здесь, ибо в Эво технологии используются, с которыми мы уже давно не работаем. А далее уже все от вас зависит. И на сколько легким переход будет - тоже не знаю, так как зависит и от вашего текущего уровня, и от способностей к обучению.
Да, естественно. Попробую поподробнее познакомиться с Рево для начала, и станет понятнее.

Добавить комментарий