1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Внутренности Rivet</title><link rel="stylesheet" href="rivet.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.66.1"><link rel="start" href="index.ru.html" title="Apache Rivet"><link rel="up" href="index.ru.html" title="Apache Rivet"><link rel="prev" href="help.ru.html" title="Ресурсы и как получить помощь"><link rel="next" href="upgrading.ru.html" title="Переход с mod_dtcl или NeoWebScript (NWS)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Внутренности Rivet</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="help.ru.html"><img src="images/prev.png" alt="Пред."></a></td><th width="60%" align="center"></th><td width="20%" align="right"><a accesskey="n" href="upgrading.ru.html"><img src="images/next.png" alt="След."></a></td></tr></table></div><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="internals"></a>Внутренности Rivet</h2></div></div></div><div class="toc"><dl><dt><span class="section"><a href="internals.ru.html#id4768568">Инициализация</a></span></dt><dt><span class="section"><a href="internals.ru.html#id4768954">RivetChan</a></span></dt><dt><span class="section"><a href="internals.ru.html#id4769000">Команда <span style="font-family:monospace"><span><b class="command">global</b></span></span></a></span></dt><dt><span class="section"><a href="internals.ru.html#id4769086">Обработка страниц, выполнение и кеширование</a></span></dt></dl></div><p style="width:90%">
Эта секция давно устарела, поскольку новый код добавляется, а
старый убирается. Так что лучше читайте исходники - они рулез!.
А если вам интересны изменения, то пользуйтесь <span style="font-family:monospace"><span><b class="command">cvs</b></span></span>
</p><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4768568"></a>Инициализация</h3></div></div></div><p style="width:90%">
Когда apavhe запускается (или когда запускается использующий TCL
дочерний процесс Apache если Tcl собран с поддержкой threads), вызывается
<tt class="function">Rivet_InitTclStuff</tt>,
который создает новый интерпретатор, по одному на каждый
виртуальный хост, в зависимости от конфигурации. Также инициализируются
всякие вещи типа
<span class="structname">RivetChan</span> канальная система (channel system),
создаются специфичные для Rivet Tcl команды и исполняется Rivetовский
channel system, creates the Rivet-specific Tcl commands, and
<tt class="filename">init.tcl</tt>. Система кеширования, опять же, и если
есть
<span style="font-family:monospace"><span><b class="command">GlobalInitScript</b></span></span>, то и он запускается.
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4768954"></a>RivetChan</h3></div></div></div><p style="width:90%">
Система <span class="structname">RivetChan</span> была создана для того чтобы
перенаправлять стандартный поток вывода (stdout). По этой причине вы можете
использовать стандартную команду
<span style="font-family:monospace"><span><b class="command">puts</b></span></span> в страницах .rvt.
(примечание переводчика: и <span style="font-family:monospace"><span><b class="command">fconfigure</b></span></span> тоже, что полезно).
Она также создает канал который буферизует output, и перенаправляет его в
систему ввода-вывода Apache.
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4769000"></a>Команда <span style="font-family:monospace"><span><b class="command">global</b></span></span></h3></div></div></div><p style="width:90%">
Rivet сделан так, что должен запускать Tcl код с минимальным
количеством неожиданностей, Но иногда приходится идти на
компромиссы - в этом случае вам и пригодится команда
<span style="font-family:monospace"><span><b class="command">global</b></span></span>. Проблема в том что эта команда создаст
вам действительно глобальную переменную, и если пользователь
просто задействует старый код без изменений, скорее всего
он захочет получить доступ к переменным из других програм, не
желая заботиться проверкой того как передается эта переменная
из страницы в страницу. По этому поводу мы и создали процедурку
<span style="font-family:monospace"><span><b class="command">::request::global</b></span></span> которая и выполняет
роль команды <span style="font-family:monospace"><span><b class="command">global</b></span></span> в Rivet страницах. Если
вам на самом деле нужны настоящие глобальные переменные, используйте
команду
<span style="font-family:monospace"><span><b class="command">::global</b></span></span> или добавьте :: namespace
к переменным которые вы хотите сделать глобальными
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4769086"></a>Обработка страниц, выполнение и кеширование</h3></div></div></div><p style="width:90%">
Когда выполняется Rivet страница, она превращается в обычный Tcl
скрипт, опираясь на символы <? ?>. Все что вне их
рассматривается как большой большой аргумент для
<span style="font-family:monospace"><span><b class="command">puts</b></span></span>, а все что внутри - рассматривается
как Tcl код.
</p><p style="width:90%">
Каждый .rvt файл выполняется в простанстве имен
<tt class="constant">::request</tt>, по этому нет необходимости
каждый раз создавать по новому интерпретатору. По этой же
причине глобальные переменные
(примечание преводчика: звиняйте, не понял)
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.
</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Замечание]" src="images/note.png"></td><th align="left">Замечание</th></tr><tr><td colspan="2" align="left" valign="top">
Одна из существующих ныне проблем подобного подхода - это отсутсвие
механизма сборщика мусора, например, если вы не закрыли
хэндл файла - то это плохо. Поэтому будьте добры, закрывайте все
что наоткрывали.
</td></tr></table></div><p style="width:90%">
После того как скрипт загружен и преобразован в "чистый Tcl",
он опять же кешируется, и по этой причине может быть использован
в следующий раз без лишних преобразований и обращений к диску.
Количество кешируемых скриптов можно изменить в конфиге.
Таким образом можно значительно поднять производительность системы.
</p></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="help.ru.html"><img src="images/prev.png" alt="Пред."></a></td><td width="20%" align="center"><a accesskey="u" href="index.ru.html"><img src="images/up.png" alt="Уровень выше"></a></td><td width="40%" align="right"><a accesskey="n" href="upgrading.ru.html"><img src="images/next.png" alt="След."></a></td></tr><tr><td width="40%" align="left" valign="top">Ресурсы и как получить помощь</td><td width="20%" align="center"><a accesskey="h" href="index.ru.html"><img src="images/home.png" alt="Начало"></a></td><td width="40%" align="right" valign="top">Переход с mod_dtcl или NeoWebScript (NWS)</td></tr></table></div></body></html>
|