Архитектура MediaWiki

Это — «блиц»-доклад с ADD-2011. «Блиц» в кавычках, потому что получился совсем не блиц, а весьма адский спич на полчаса. Так как родил я (Виталий Филиппов) доклад в последний момент и было уже не до презентации, быстренько наваял «Long-Scroll» JS движок для выступления прямо под длиннющий mindmapообразный список.

Long-Scroll

В действии Long-Scroll можно посмотреть здесь. Ясное дело, что на кроссбраузерность я не запаривался, в Firefox оно работает — и ладно.

Видеопрезентация со звуком:

Также её можно посмотреть здесь: http://vmx.yourcmc.ru/vitaphotov3/Фото:20110430-173000.

Список-майндмап

  • Кто есть я
    • Виталий Филиппов
    • CUSTIS (Заказные ИнформСистемы)
    • Нет, компания не занимается поддержкой MediaWiki!
    • Но используем и пилим
    • Мы со Стасом уже рассказывали [[:||||||:]] про MediaWiki (Стас — Фомин)
    • Этот доклад — не боян =)
    • http://wiki.4intra.net/
  • Что есть MediaWiki
    • В первую очередь это — Wiki
      • Plaintext разметка
      • Версионирование
      • Общедоступная правка
    • (L)AMP (P=PHP)
    • GPL
    • База знаний
    • Офигенно расширяемый комбайн
    • Wikipedia
    • Неплохо написана и шустро ворочается
    • Довольно стабильна, мало изменений с новыми версиями
  • Архитектура
    • Модель контента
    • Интерфейс
      • Запрос и ответ
      • Спецстраницы
      • Локализация
      • Скин
      • JS и AJAX
      • API
    • Кишки
      • Конфиг
      • БД
      • Файловый репозиторий
      • Парсер
      • Расширения
      • Кэш
    • отладка, Maintenance
  • Модель контента
    • СТРАНИЦЫ
    • Обычные и служебные
    • Изображения/файлы
    • Адресуются по реальному названию
      • Есть редиректы
    • Пространства имён
      • Каждому соответствует парное «обсуждение»
      • Обычные: (Основное), Участник, YourcmcWiki, Справка
      • Не совсем обычные: Файл, Шаблон, Категория
      • (расширяется)
    • Контент «перманентный» = статьи+файлы (ну, ещё юзеры)
    • Остальное «сбоку»
      • Всякие кэши — свежие правки, ссылки, включения, списки по категориям и т. п.
      • Данные расширений — например, черновики, данные опросов и т. п.
  • [[Междумордие]]
  • WebRequest и OutputPage
    • Обёртка для $_REQUEST
      • Фиксит какие-то баги:
      • Обходит magic quotes, фиксит юникод
      • Но вообще-то не очень нужен
    • Обёртка для вывода
      • CSS, JS, Title, сообщений, cache control, ошибок, <link>
    • MW - не MVP/MVC
      • Вывод (P/C) частично смешан с объектами (V)
        • Правда, не сильно
        • Article::view
      • Шаблонизатора нет
      • HTML генерируется почти "принтами"
      • Html::element
      • Ну и пофиг
  • Интерфейс страниц
    • Обычные
      • Модель очень простая:
      • Просмотр, правка, история
      • Всё это переопределяется
    • Спецстраницы
      • = Интерактивные страницы
      • Списки (тысячи их)
      • Управление юзерами, вход/регистрация, личные настройки
      • Поиск
        • В 1.16 «движок поиска» выделен в отдельный уровень
        • Можно подменить «движок», а морда останется
      • Загрузка файлов
      • Импорт/экспорт
        • У нас классно доработан!
      • Инструменты
        • Version Info, список наблюдения, интервики и т. п.
  • JS и AJAX
    • Есть набор JS-скриптов (skins/common/*.js)
    • Есть своя AJAX-обёртка, очень удобная
      • «Экспортирует» глобальные PHP-функции
    • На каждой странице определена кучка глобальных переменных wg***
    • В 1.16+ встроенный jQuery (1.3.2 в 1.16)
    • В 1.17 «ресурсы» $wgResources
      • Удобное включение в вывод JS и CSS
      • Экспорт локализации в javascript
  • Скин
    • PHP + CSS
    • Просто расставляет готовые блоки и ссылки по странице
    • Прост, потому что нет сложной сайто-гламурной вёрстки
      • … и потому что большой блок с данными ровно ОДИН
    • Прост, поэтому PHP == шаблонизатор не рвёт мозг
    • MonoBook и Vector
  • API
    • REST-XML
    • Развивается
    • Примерный смысл — совершать те же действия, что из интерфейса
  • Локализация
    • 352 языка/варианта (1.16)
    • Таблицы сообщений
      • Сообщения интерфейса
      • Пространства имён, парсер функции, магические слова, спецстраницы
    • Форматы дат, чисел, таймзоны, дни недели, месяцы и т. п.
    • Теоретически даже поддерживает R-T-L и китайские локали
    • Языковые версии статьи (интервики-ссылка с префиксом, равным коду языка)
    • Устройство
      • $wgContLang, $wgLang
      • wfMsg, wfMsgExt, wfMsgNoTrans, wfMsg
      • wfLoadExtensionMessages
      • Пространство имён MediaWiki: (то есть почти всё переопределяется)
  • [[Кишки]]
  • Конфигурация
    • Элементарный PHP-файл LocalSettings.php
    • С миллионом опций $wgЧтоНибудь
      • $wgТормозить, $wgНеТормозить
    • Все посмотреть можно в DefaultSettings.php
    • В неё же включаются расширения
    • Есть инсталлятор «/config/», генерит конфиг и пустую БД
  • БД
    • В ней хранится почти всё
    • Правильные имена полей
    • Почти не генерирует сложных запросов
      • Наверное, относительно несложно натянуть на NoSQL
    • Прикольный «sql builder»
      • (tables, fields, where, options = {group, order, hints, joins})
      • Меняет имена таблиц
      • Умеет формировать запросы, обращающиеся к разным базам ($wgSharedTables)
      • Результат запроса заворачивается в итератор
      • Используют его не совсем все
    • В базу можно лазать напрямую
      • Для основного объектные обёртки из ядра
      • Например Title, Article, Revision, File
      • Статьи править только через Article
    • В код заложен мастер+слейв и лоад балансер
    • Сама MW поддерживает MySQL, PostgreSQL, MSSQL, Oracle, SQLite
      • Сама значит, что очень многие расширения поддерживают только MySQL
  • Файловый репозиторий
    • Хранятся файлы
    • Они тоже версионируются
      Изврат с timestamp’ами
    • В основном картинки, до 1.14 даже пространство имён было «Изображение»
    • Умеет хранить на image серверах
    • Выделен в отдельный уровень
      • Чисто теоретически можно попробовать подменить
      • Например идея — натянуть вики на VCS как бэкенд
  • Парсер
    • "Win"
    • Возможности разметки:
      • Форматирование (Ж К)
      • Включения шаблонов
      • Магические слова
        • xxxxPAGENAME, REVISIONxxxx и т. п.
      • Функции парсера
      • XML-подобные теги
    • На DOM, а где нет — на подстроках
      • Важно, что не на регэкспах ("+")
      • Но и важно, что не на грамматике ("-" ?)
        • Хотя вон Template Toolkit на LALR (Parse::Yapp), а толку-то
        • (тормоз тормозом)
      • ⇒ Отлично ускоряется методами господ Ахо-Корасик/Бойера-Мура/Комменца-Вальтера, если это кому-то о чём-то говорит
    • «-» Нереентерабельный (щас пилят новый)
      • mStripState и UNIQ-…-QINU
    • ParserOutput
      • На выходе парсер даёт не просто HTML-код
      • head items, cache time, links
    • Терминология:
      • parse: Wiki → HTML
      • preprocess: Wiki → Wiki (раскрытие шаблонов)
        • есть юзеринтерфейс и API
      • preSaveTransform: дёргается перед сохранением
        • раскрытие подписи ~~~~ и ещё чуть-чуть
        • не содержит хуков :-/
    • doBlockLevels → последний этап парсера, форматирует списки и абзацы
      • Туповата в оригинале, у нас запатчена
  • Кэш
    • Умеет базу, memcached, XCache/eAccelerator/APC
    • Кэш парсера
    • MessageCache
    • LocalisationCache
    • Файловый кэш (HTML), умеет сидеть сзади squid’а
    • Кэш на клиентской стороне
    • Пилится кэш на зависимостях
  • Расширения
    • Их over 1700
    • Расширяется очень легко и почти всё без вмешательства в код MW
      • Хуки (куча их)
      • Спецстраницы
      • Парсер-хуки на теги, на функции
        • Типичный прикол: использование wfMsgExt внутри тега/функции ⇒ UNIQ-…-QINU
      • Локализация
      • Медиаобработчики
      • Специальные пространства имён
      • Пользовательские настройки
        • В 1.16 даже расширяются стандартным путём
      • Подклассы "статьи"
    • Есть такая хорошая вещь, как AutoLoader классов
    • Включение расширения — как правило включение его «заголовка»/«инициализатора» в LocalSettings.php
    • Скин можно написать отдельно
  • Отладка
    • wfDebug
    • Profiler
      • Не очень крут, везде wfProfileIn/Out
      • -> UDP
  • Maintenance
    • maintenance/update.php
    • Остальное — немного странное и неизведанное
    • В 1.16 новая "объектная" система maintenance скриптов
      • Некоторые опции
      • Но сделана дурацки - от существующего класса не унаследуешься
      • Обратная совместимость есть
    • Много всего, 80 % — всякая фигня
    • Удалялки, проверки, дампилки чего-нибудь
    • Перестройки разных кэшей
    • Автотесты для парсера (!)
  • Win (Epic Win)
    • Хуки и расширяемость
      • Парсер тоже
    • Локализация
    • Концептуальность
    • Кэшируемость и сами кэши
      • (Wikipedia ворочается хорошо)