Ждем нового MODX-а, где будет принципиальная переработки системы модулей. Джейсон над ней во всю работает.
В этом плане круто было бы пакеты первести на Composer. Там и гит без геммороя, и другие интересные вещи. И тестить там просто — указал в конфиге композера ветки у нужных проектов, собрал, погонял, обратно в мастер переключился. Но это реально только в новой версии, на revo такое сложно сделать.
Сразу отмечу, что этот топик — начало цикла статей, в которых я буду описывать реальный опыт переноса большого магазина с Эво на Рево, так что не редко темы будут казаться не законченными, продолжение в новых топиках. Начали разработку нового крупного магазина, точнее перенос имеющегося с 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 документов обновляет где-то за минуту-полторы). Вот скрипт: Относительно кеша мы еще поговорим дальше не раз. Все, обновил все 30000+ документов. Часа 2 заняло. Само собой не все два часа я трудился, просто время от времени скрипт перезапускал. После всей этой процедуры имеет смысл полностью очистить папку кеша по ряду причин. Проблема два — большой файл кеша. После полного прогона УРЛов и генерации файла кеша с картой ресурсов, файл кеша весит почти 5 метров, а php требует для свой работы 36 метров с ходу. Это конечно меньше, чем Эво желает, но все равно не айс. Тем не менее, у нас есть пространство для маневров: ведь основной фишкой Рево-2.2.7 была как раз возможность частичного отключения кеширования карты ресурсов (системная настройка cache_alias_map). Сейчас ей и воспользуюсь, то есть отключу ее. Результат: кеш файла сократился до 700 кило, а потребление памяти до 10-ти метров. Результат очевидный! В общем, проблема с кешем тоже решена (10 метров против 156-ти, по-моему очень хороший результат). Кто там говорил, что Эво легкая, а Рево тяжелая? Всегда говорил — голая Рева конечно тяжеловатая, но она горизонтально масштабируется, а Эва вертикально. Все, что вешается на Эво, все сверху ложится, а в Рево можно аккуратно по полкам разложить. Это я еще не проводил тюнинг, ведь и документы можно раскидать по разным контекстам, так, что кеш еще в разы упадет. Но пока это не требуется. На сегодня все. Много всего интересного еще будет в следующих топика. Это, так сказать, начало еще.
Довольно часто всплывает такой вопрос: перенесли сайт на новый движок, закинули через phpmyadmin документы, а uri пустые. Или вообще раньше не использовались ЧПУ, а сейчас захотелось, такое вот критическое обновление. В общим причин много бывает, да и не суть. Топик о том, как массово обновить uri документов на MODX Revolution через API MODX-а. Исходные данные: сайт с кучей ресурсов без актуального uri. Цель: обновить все документы, чтобы у всех появились uri. Для начала надо еще один момент оговорить: у вас уже на сайте все документы могут иметь алиасы, а могут быть и без алиасов. То есть если алиасов нет, и надо еще чтобы они так же были автоматически созданы, то надо включить автоматическую генерацию алиасов. А если хотите еще и транслитерацию автоматическую, то надо еще, к примеру, поставить и настроить translit. Но это уже отдельная тема и по ней инфу можно найти в других топиках. Итак, чтобы у нас сгенерировались новые uri, нам всего лишь надо обновить ресурсы. И лучше это делать не через ->save(), а именно через процессор resource/update, так как только там полный набор всех проверок. И этот способ годится и для обновления групп ресурсов, TV-параметров и т.п. (само собой с некоторыми модификациями).
Вот небольшой скрипт, который можно выполнять через Console. Здесь очень важный момент: $q->limit(1); Лучше именно один и использовать. Объясню. Когда вы отправляете на обновление ресурс, обновляется не только он, но и дочерние. Потому если вы обновляете в корне сайта какой-то документ-раздел, тогда и внутренние тоже получат новые uri. Но после того, как пройдете все документы первого уровня, на всякий случай удалите условие поиска по родителю, оставив только условия не заполненного uri, и тогда если что-то еще останется и процесс не очень активно будет протекать, можно будет увеличить лимит выборки.
Сегодня проводил обновление сайта на MODX Revolution 2.0.8 до версии 2.2.5 и хочу поделиться опытом, может кому пригодится. Для начала проблема: нельзя 2.0.8 обновить сразу до версии 2.2.5 в автоматическом режиме (если у кого-то есть другое мнение, с радостью выслушаю). Со времен 2.0.х не только удалили много деприкативного кода, так еще и добавили много всего, и изменения коснулись не только файловой системы, но и в базе данных много изменений появилось. В связи с этим увидел только один вариант: развернуть новый сайт и перенести туда все из старого. И как оказалось, это не так уж и сложно оказалось сделать. Здесь вам phpMyAdmin в помощь. Но успех переноса обратнопропорционален привычке вносить изменения в сторонние пакеты (в том числе и в базовые настройки пакетов). Итак, постараюсь вкратце описать принцип. Последовательность действий такая:
Нет, особо посоветовать ничего не могу. Сам во всем разбирался сам, и если где-то и есть что-то, то я просто могу об этом не знать. А так вот раздел по xPDO есть: community.modx-cms.ru/blog/modx-xpdo/ Там несколько статей, но очень полезные.
Разобрался, спасибо за ответы. Николай, Вы не могли бы порекомендовать хороший ресурс, желательно русскоязычный, по MODX API? Мне попадаются либо самые азы, либо дебри, и все как-то разрозненно, по кусочкам. Я с удовольствием посетил бы Ваши уроки, но в данный момент я сам прохожу программу Нарконон, а выезды у нас не практикуются, поэтому это пока в планах на недалекое будущее, а руки уже чешутся, есть несколько идей, хочется попробовать. Сам я почти 20 лет писал на С++, Delphi, в т.ч. базы данных, немного на Perl. PHP знаю пока поверхностно, но с ним проблем никаких. Хотелось бы почитать что-нибудь последовательное, от простого к сложному, и желательно на русском. Буду очень признателен за ответ.
Разобрались со своими редиректами? Как я вижу, с .html нормально редирект идет. www.narcononmsk.ru/syin-narkoman?q=syin-narkoman.html, хотя изначально там переход Здесь у вас чуть сложнее будет. Вы настроили серверные правила редиректа. То есть при обращении к страницам с .html, дело до MODX-а еще не доходит. Сервер видит запрос к документу с суффиксом .html и редиректит по правилу. Далее уже вступает в дело MODX. Но это правило анализирует имя файла, к которому идет запрос, а не параметры. В запросе www.narcononmsk.ru/syin-narkoman?q=syin-narkoman.html syin-narkoman.html — не имя файла, а значение переменной q. Сервер его не проверяет и не редиректит. То есть он отдает запрос MODX-у. Но q — это зарезервированная переменная MODX-а, которую он использует для определения запрошенного документа, и хотя у вас запрошена страница syin-narkoman, которая для MODX-а по сути имеется, переменная q перебивает этот адрес, заставляя MODX думать, что запрошена страница syin-narkoman.html. Но этой страницы для MODX-а не имеется (вы сами у себя удалили суффиксы .html). Про правила редиректа на стороне веб-сервера MODX ничего не знает, и совершенно их не использует, а отдает законную 404-ую в ответ на ненайденную страницу. Резюме: безусловно надо еще перестраховываться с редиректами на стороне самого MODX-а. Создайте плагин на событие OnPageNotFound, и настройте те же правила на регулярках, только на php, используя переменную $modx->resourceIdentifier и метод $modx->sendRedirect($url); Примерный код плагина: if(!empty($modx->resource) && is_object($modx->resource)){ return; }
if(preg_match('/(.+).html([?#$]?.*)/', $modx->resourceIdentifier, $match)){ $modx->sendRedirect("{$1}{$2}"); return; }