Изменения

Перейти к: навигация, поиск

Архитектура MediaWiki/Список-майндмап

12 240 байтов добавлено, 20:05, 3 мая 2011
м
Новая страница: «<div id="scroll-list"> * Кто есть я ** Виталий Филиппов ** CUSTIS (Заказные ИнформСистемы) ** Нет, компания н...»
<div id="scroll-list">
* Кто есть я
** Виталий Филиппов
** CUSTIS (Заказные ИнформСистемы)
** Нет, компания не занимается поддержкой MediaWiki!
** Но используем и пилим
** Мы со Стасом уже рассказывали [[:||||||:]] про MediaWiki (Стас — Фомин)
** Этот доклад — не боян =)
** http://wiki.4intra.net/

* Что есть MediaWiki
** В первую очередь это — Wiki
*** Plaintext разметка
*** Версионирование
*** Общедоступная правка
** (L)AMP (P=PHP)
** GPL
** База знаний
** Офигенно расширяемый комбайн
** Wikipedia
** Неплохо написана и шустро ворочается
** Довольно стабильна, мало изменений с новыми версиями

* Архитектура
** Модель контента
** Интерфейс
*** Запрос и ответ
*** Спецстраницы
*** Локализация
*** Скин
*** JS и AJAX
*** API
** Кишки
*** Конфиг
*** БД
*** Файловый репозиторий
*** Парсер
*** Расширения
*** Кэш
** отладка, Maintenance

* Модель контента
** '''СТРАНИЦЫ'''
** Обычные и служебные
** Изображения/файлы
** Адресуются по реальному названию
*** Есть редиректы
** Пространства имён
*** Каждому соответствует парное «обсуждение»
*** Обычные: (Основное), Участник, {{SITENAME}}, Справка
*** Не совсем обычные: Файл, Шаблон, Категория
*** (расширяется)
** Контент «перманентный» = статьи+файлы (ну, ещё юзеры)
** Остальное «сбоку»
*** Всякие кэши — свежие правки, ссылки, включения, списки по категориям и т. п.
*** Данные расширений — например, черновики, данные опросов и т. п.

* '''<nowiki>[</nowiki>[Междумордие]]'''

* WebRequest и OutputPage
** Обёртка для $_REQUEST
*** Фиксит какие-то баги:
*** Обходит magic quotes, фиксит юникод
*** Но вообще-то не очень нужен
** Обёртка для вывода
*** CSS, JS, Title, сообщений, cache control, ошибок, &lt;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: (то есть почти всё переопределяется)

* '''<nowiki>[</nowiki>[Кишки]]'''

* Конфигурация
** Элементарный 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 ({{CPAN|Parse::Yapp}}), а толку-то
**** (тормоз тормозом)
*** &rArr; Отлично ускоряется методами господ Ахо-Корасик/Бойера-Мура/Комменца-Вальтера, если это кому-то о чём-то говорит
** «-» Нереентерабельный (щас пилят новый)
*** mStripState и UNIQ-…-QINU
** ParserOutput
*** На выходе парсер даёт не просто HTML-код
*** head items, cache time, links
** Терминология:
*** parse: Wiki &rarr; HTML
*** preprocess: Wiki &rarr; Wiki (раскрытие шаблонов)
**** есть юзеринтерфейс и API
*** preSaveTransform: дёргается перед сохранением
**** раскрытие подписи <nowiki>~~~~</nowiki> и ещё чуть-чуть
**** не содержит хуков :-/
** doBlockLevels &rarr; последний этап парсера, форматирует списки и абзацы
*** Туповата в оригинале, у нас запатчена

* Кэш
** Умеет базу, memcached, XCache/eAccelerator/APC
** Кэш парсера
** <s>MessageCache</s>
** LocalisationCache
** Файловый кэш (HTML), умеет сидеть сзади squid’а
** Кэш на клиентской стороне
** Пилится кэш на зависимостях

* Расширения
** Их over 1700
** Расширяется очень легко и почти всё без вмешательства в код MW
*** Хуки (куча их)
*** Спецстраницы
*** Парсер-хуки на теги, на функции
**** Типичный прикол: использование wfMsgExt внутри тега/функции &rArr; UNIQ-…-QINU
*** Локализация
*** Медиаобработчики
*** Специальные пространства имён
*** Пользовательские настройки
**** В 1.16 даже расширяются стандартным путём
*** Подклассы "статьи"
** Есть такая хорошая вещь, как AutoLoader классов
** Включение расширения — как правило включение его «заголовка»/«инициализатора» в LocalSettings.php
** Скин можно написать отдельно

* Отладка
** wfDebug
** Profiler
*** Не очень крут, везде wfProfileIn/Out
*** -> UDP

* Maintenance
** maintenance/update.php
** Остальное — немного странное и неизведанное
** В 1.16 новая "объектная" система maintenance скриптов
*** Некоторые опции
*** Но сделана дурацки - от существующего класса не унаследуешься
*** Обратная совместимость есть
** Много всего, 80 % — всякая фигня
** Удалялки, проверки, дампилки чего-нибудь
** Перестройки разных кэшей
** Автотесты для парсера (!)

* Win (Epic Win)
** Хуки и расширяемость
*** Парсер тоже
** Локализация
** Концептуальность
** Кэшируемость и сами кэши
*** (Wikipedia ворочается хорошо)

* Все =) контакты:
** [[Участник:VitaliyFilippov|Виталий Филиппов]]
** [http://belonesox.moikrug.ru/ Cтас Фомин]
</div>

Навигация