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

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

Do you want to try some new features? By joining the beta, you will get access to experimental features, at the risk of encountering bugs and issues.

Ок Нет, спасибо

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 ворочается хорошо)