Архитектура 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
- Неплохо написана и шустро ворочается
- Довольно стабильна, мало изменений с новыми версиями
- В первую очередь это — Wiki
- Архитектура
- Модель контента
- Интерфейс
- Запрос и ответ
- Спецстраницы
- Локализация
- Скин
- 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
- Ну и пофиг
- Вывод (P/C) частично смешан с объектами (V)
- Обёртка для $_REQUEST
- Интерфейс страниц
- Обычные
- Модель очень простая:
- Просмотр, правка, история
- Всё это переопределяется
- Спецстраницы
- = Интерактивные страницы
- Списки (тысячи их)
- Управление юзерами, вход/регистрация, личные настройки
- Поиск
- В 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 ворочается хорошо)
- Хуки и расширяемость
- Все =) контакты: