Внутренности Rivet

Инициализация
RivetChan
Команда global
Обработка страниц, выполнение и кеширование

Эта секция давно устарела, поскольку новый код добавляется, а старый убирается. Так что лучше читайте исходники - они рулез!. А если вам интересны изменения, то пользуйтесь cvs

Инициализация

Когда apavhe запускается (или когда запускается использующий TCL дочерний процесс Apache если Tcl собран с поддержкой threads), вызывается Rivet_InitTclStuff, который создает новый интерпретатор, по одному на каждый виртуальный хост, в зависимости от конфигурации. Также инициализируются всякие вещи типа RivetChan канальная система (channel system), создаются специфичные для Rivet Tcl команды и исполняется Rivetовский channel system, creates the Rivet-specific Tcl commands, and init.tcl. Система кеширования, опять же, и если есть GlobalInitScript, то и он запускается.

RivetChan

Система RivetChan была создана для того чтобы перенаправлять стандартный поток вывода (stdout). По этой причине вы можете использовать стандартную команду puts в страницах .rvt. (примечание переводчика: и fconfigure тоже, что полезно). Она также создает канал который буферизует output, и перенаправляет его в систему ввода-вывода Apache.

Команда global

Rivet сделан так, что должен запускать Tcl код с минимальным количеством неожиданностей, Но иногда приходится идти на компромиссы - в этом случае вам и пригодится команда global. Проблема в том что эта команда создаст вам действительно глобальную переменную, и если пользователь просто задействует старый код без изменений, скорее всего он захочет получить доступ к переменным из других програм, не желая заботиться проверкой того как передается эта переменная из страницы в страницу. По этому поводу мы и создали процедурку ::request::global которая и выполняет роль команды global в Rivet страницах. Если вам на самом деле нужны настоящие глобальные переменные, используйте команду ::global или добавьте :: namespace к переменным которые вы хотите сделать глобальными

Обработка страниц, выполнение и кеширование

Когда выполняется Rivet страница, она превращается в обычный Tcl скрипт, опираясь на символы <? ?>. Все что вне их рассматривается как большой большой аргумент для puts, а все что внутри - рассматривается как Tcl код.

Каждый .rvt файл выполняется в простанстве имен ::request, по этому нет необходимости каждый раз создавать по новому интерпретатору. По этой же причине глобальные переменные (примечание преводчика: звиняйте, не понял) By running in its own namespace, though, each page will not run afoul of local variables created by other scripts, because they will be deleted automatically when the namespace goes away after Apache finishes handling the request.

[Замечание]Замечание
Одна из существующих ныне проблем подобного подхода - это отсутсвие механизма сборщика мусора, например, если вы не закрыли хэндл файла - то это плохо. Поэтому будьте добры, закрывайте все что наоткрывали.

После того как скрипт загружен и преобразован в "чистый Tcl", он опять же кешируется, и по этой причине может быть использован в следующий раз без лишних преобразований и обращений к диску. Количество кешируемых скриптов можно изменить в конфиге. Таким образом можно значительно поднять производительность системы.