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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
|
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Apache Rivet</title><link rel="stylesheet" href="rivet.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.66.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="article" lang="ru"><div class="titlepage"><div><div><h1 class="title"><a name="id4744570"></a>Apache Rivet</h1></div><div><div class="author"><h3 class="author"><span class="firstname">The Rivet Team</span></h3><div class="affiliation"><span class="orgname">The Apache Software Foundation<br></span><div class="address"><p><br>
<tt class="email"><<a href="mailto:rivet-dev@tcl.apache.org">rivet-dev@tcl.apache.org</a>></tt><br>
</p></div></div></div></div><div><p class="othercredit"><span class="contrib">Russian Translation</span>: <span class="firstname">Dmitry</span> <span class="othername">the</span> <span class="surname">Zuryanovich</span></p><div class="affiliation"><div class="address"><p><tt class="email"><<a href="mailto:dtz@xepb.ru">dtz@xepb.ru</a>></tt></p></div></div></div><div><p class="copyright">Copyright 2002, 2003 Apache Software Foundation</p></div></div><hr></div><div class="toc"><p><b>Содержание</b></p><dl><dt><span class="section"><a href="#id4695307">Введение в Apache Rivet</a></span></dt><dt><span class="section"><a href="#installation">Установка Apache Rivet</a></span></dt><dt><span class="section"><a href="#directives">Конфигурационные параметры Rivet Apache</a></span></dt><dt><span class="section"><a href="#commands">Rivet: Tcl команды и переменные</a></span></dt><dt><span class="section"><a href="#examples">Примеры использования</a></span></dt><dt><span class="section"><a href="#tcl_packages">Rivet Tcl packagы</a></span></dt><dt><span class="section"><a href="#help">Ресурсы и как получить помощь</a></span></dt><dd><dl><dt><span class="section"><a href="#id4748152">Mailing Lists</a></span></dt><dt><span class="section"><a href="#id4747950">Новостная группа</a></span></dt><dt><span class="section"><a href="#websites">Веб сайты</a></span></dt><dt><span class="section"><a href="#id4748060">Система отлова ошибок</a></span></dt><dt><span class="section"><a href="#id4748336">IRC</a></span></dt><dt><span class="section"><a href="#id4748351">Редактирование Rivet файлов</a></span></dt></dl></dd><dt><span class="section"><a href="#internals">Внутренности Rivet</a></span></dt><dd><dl><dt><span class="section"><a href="#id4748430">Инициализация</a></span></dt><dt><span class="section"><a href="#id4748494">RivetChan</a></span></dt><dt><span class="section"><a href="#id4748540">Команда <span style="font-family:monospace"><span><b class="command">global</b></span></span></a></span></dt><dt><span class="section"><a href="#id4748626">Обработка страниц, выполнение и кеширование</a></span></dt></dl></dd><dt><span class="section"><a href="#upgrading">Переход с mod_dtcl или NeoWebScript (NWS)</a></span></dt><dd><dl><dt><span class="section"><a href="#id4748735">mod_dtcl</a></span></dt><dt><span class="section"><a href="#id4748754">NeoWebScript</a></span></dt></dl></dd></dl></div><p style="width:90%">
Этот документ в переводах на другие языки: <a href="index.en.html" target="_top">English</a>, <a href="index.it.html" target="_top">Italian</a>
</p><p style="width:90%">This document is based on version 1.34 of the original English
version.</p><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="id4695307"></a>Введение в Apache Rivet</h2></div></div></div><p style="width:90%">
Apache Rivet - это система для генерации динамических веб
страниц, встроенная модулем в http сервер Apache. Она задумывалась
как система быстрая, мощная, расширяемая и достаточно простая для
внедрения. Стоит заметить что с Apache Rivet вы получаете надежную
платформу которая не только может интегрироваться в web, но
и может быть использована вне его. GUI, инструментарий администратора,
XML, манипуляции с БД, консольные приложения могут использовать тот
же код, который используется при разработках web-приложений.
Это достигается применением языка TCL - вне и внутри Apache сервера.
</p><p style="width:90%">
В этом документе мы постараемся помочь вам быстро разобраться как
можно создавать web- приложения, и показать вам дальнейшие
пути для разработки приложений используя rivet для самых
разнообразных применений.
</p><p style="width:90%">
Эта документация - как и весь rivet, и тем более ее перевод на
русский - это работа, которая не заврешена, и будем надеяться
будет продолжаться еще очень долго.
Если вы видите что что-то где-то почему-то не так - то пишите
об этом, мы сами за всем не углядим без вашей помощи.
Это Свободное программное обеспечение!
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="installation"></a>Установка Apache Rivet</h2></div></div></div><div class="procedure"><ol type="1"><li><p class="title"><b>Check Dependencies/Проверка связей между программным обеспечением</b></p><p style="width:90%">
Для того чтобы установить rivet, вам в первую очередь понадобится
сам Tcl, версии 8.4 или выше и веб сервер Apache версий 1.3.x. Известно
что все должно работать на Linux, FreeBSD,OpenBSD, Solaris и HPUX. Возможно что
можно заставить работать даже на Windows NT - в дистрибутиве
написано как это делать.
</p></li><li><p class="title"><b>Скачайте себе Rivet</b></p><p style="width:90%">
Возьмите исходники отсюда <a href="http://tcl.apache.org/rivet/download" target="_top">http://tcl.apache.org/rivet/download</a>.
На данный момент это единственный способ получить rivet.
Возможно в дальнейшем появится FreeBSD port, Debian package,
RPM и бинарники под Windows.
</p></li><li><p class="title"><b>Скачайте и соберите Apache</b></p><p style="width:90%">
Rivety нужны заголовки (.h) от Apache. Самый простой способ -
это скачать исходники Apache, хотя во многих системах (Debian,
например) позволяют поставить отдельно заголовки и прочие
вещи, необходимые для разработчиков. Если вы хотите собрать
rivet в статике (вместо того чтобы грузить его как .so), то
вам придется скачать все исходники apache отсюда
<a href="http://httpd.apache.org/" target="_top">http://httpd.apache.org/</a>.
Мы рекомендуем собирать rivet как динамическую библиотеку
(shared object), и соответственно собирать его отдельно от Apache.
</p><p style="width:90%">
Исходный код apache берут тут:<a href="http://httpd.apache.org/" target="_top">http://httpd.apache.org/</a>
</p></li><li><p class="title"><b>Разархивация исходников</b></p><p style="width:90%">
Сейчас мы будем считать что apache вами был каким-то образом
установлен. Теперь вы должны разархивировать исходники
rivet там где вы хотите их собирать.
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">gunzip tcl-rivet-X.X.X.tar.gz
tar -xvf tcl-rivet-X.X.X.tar.gz</pre><p style="width:90%">
</p></li><li><p class="title"><b>Компиляция Rivet</b></p><p style="width:90%">
Rivet использует некую свою уникальную систему компиляции
которую мы специально придумали именно для него. Она
использует информацию из инсталяций Apache (через
<span style="font-family:monospace"><span><b class="command">apxs</b></span></span>)и Tcl, для того чтобы собрать rivet
через набор Tcl скриптов, которые находятся
<tt class="filename">buildscripts/</tt> тут.
</p><ol type="a"><li><p class="title"><b>Запустите ./configure.tcl</b></p><p style="width:90%">
По смыслу это практчески то же что и
<tt class="filename">configure</tt>, скрипт который встречается
в большинстве систем. Он, конечно же, написан на Tcl.
У него есть несколько полезных аргументов:
</p><div class="variablelist"><dl><dt><span class="term">-help</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">Показывает справку.</div></div></dd><dt><span class="term">-enable-symbols</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">Компилирует Rivet c символами для дебаггера.</div></div></dd><dt><span class="term">-prefix <i class="replaceable"><tt>directory</tt></i></span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Место в котором будет установлен Rivet.
</div></div></dd><dt><span class="term">-with-apxs <i class="replaceable"><tt>file</tt></i></span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex"> <i class="replaceable"><tt>file</tt></i> который должен
использоваться как apxs binary для сбора информации о
инсталлированном Apache</div></div></dd><dt><span class="term">-with-tclconfig <i class="replaceable"><tt>file</tt></i></span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Использовать <i class="replaceable"><tt>file</tt></i> как tclConfig.sh.
</div></div></dd></dl></div><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">cd src/
./configure.tcl
Configuring
.........done.</pre></li><li><p class="title"><b>Запустите make.tcl</b></p><p style="width:90%">
Сейчас нужно скомпилировать Rivet:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">./make.tcl <i class="replaceable"><tt>option</tt></i></pre><p style="width:90%">где <i class="replaceable"><tt>option</tt></i> может быть
shared или
static.
</p></li><li><p class="title"><b>Установка</b></p><p style="width:90%">
Сейчас самое время запустить
<span style="font-family:monospace"><span><b class="command">./make.tcl
install</b></span></span> чтобы все установить.
Эта команда должна скопировать получившийся .so
файл (типа
<tt class="filename">mod_rivet.so</tt>), если он конечно
скомпилируется, в директорию
Apache
<tt class="filename">libexec</tt>, а так же установит
некоторое количество полезных скриптов и прочего кода.
</p></li></ol></li><li><p class="title"><b>Конфигурация Apache</b></p><p style="width:90%">
Конфигурировать Rivet достаточно просто - начнем с того что
добавим сам модуль:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">LoadModule rivet_module <i class="replaceable"><tt>/usr/lib/apache/1.3/mod_rivet.so</tt></i></pre><p style="width:90%">
После этого Apache должен знать что ему надо загрузить
Rivet как shared object, чтобы иметь возможность его использовать.
Далее мы должны объяснить Apache какие файлы надо обрабатывать
Rivetом и как это делать:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">AddType application/x-httpd-rivet .rvt
AddType application/x-rivet-tcl .tcl</pre><p style="width:90%">
Эти директивы объяснят Apache что файлы с расширением
<tt class="filename">.rvt</tt> и <tt class="filename">.tcl</tt>
надо обрабатывать Rivetом.
</p><p style="width:90%">
Все остальные директивы описаны тут
<a href="#directives" title="Конфигурационные параметры Rivet Apache">Конфигурационные параметры Rivet Apache</a>.
</p></li></ol></div></div><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="directives"></a>Конфигурационные параметры Rivet Apache</h2></div></div></div><p style="width:90%">
Это - разнообразный набор установок которые могут быть
сделаны в конфигурационнном файле Apache с целью
изменения поведения Rivet.
Их формат такой: <span style="font-family:monospace"><span><b class="command">RivetDirConf</b></span></span>,
<span style="font-family:monospace"><span><b class="command">RivetUserConf</b></span></span>,
<span style="font-family:monospace"><span><b class="command">RivetServerConf</b></span></span>,
что означает что DirConf имеет более высокий приоритет и перебивает
установки в UserConf, что в свою очередь перебивает ServerConf.
</p><div class="variablelist"><dl><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">RivetServerConf</span> (<span style="font-family:monospace; font-weight: bold;">CacheSize</span> | <span style="font-family:monospace; font-weight: bold;">GlobalInitScript</span> | <span style="font-family:monospace; font-weight: bold;">ChildInitScript</span> | <span style="font-family:monospace; font-weight: bold;">ChildExitScript</span> | <span style="font-family:monospace; font-weight: bold;">BeforeScript</span> | <span style="font-family:monospace; font-weight: bold;">AfterScript</span> | <span style="font-family:monospace; font-weight: bold;">ErrorScript</span> | <span style="font-family:monospace; font-weight: bold;">UploadDirectory</span> | <span style="font-family:monospace; font-weight: bold;">UploadMaxSize</span> | <span style="font-family:monospace; font-weight: bold;">UploadFilesToVar</span> | <span style="font-family:monospace; font-weight: bold;">SeperateVirtualInterps</span>)</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex"><span style="font-family:monospace"><span><b class="command">RivetServerConf</b></span></span>
Устанавливает глобальные опции для всего сервера
</div><div class="variablelist"><dl><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">CacheSize</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>size</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Устанавливает опции для внутреннего кеша для страниц, где
<i class="replaceable"><tt>size</tt></i>
- количество компилированных страниц которые будут
хранится в кеше для испозьзования в будущем. По умолчанию -
<span style="font-family:monospace"><span><b class="command">MaxRequestsPerChild</b></span></span> / 5, или 50,
если <span style="font-family:monospace"><span><b class="command">MaxRequestsPerChild</b></span></span> установлен в 0.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">GlobalInitScript</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>script</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Tcl скрипт который должен быть запущен для каждого
интерпретатора.<i class="replaceable"><tt>script</tt></i>
- обычный Tcl скрипт, поэтому чтобы запустить файл -
<pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">RivetServerConf GlobalInitScript "source /var/www/foobar.tcl"</pre>
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">ChildInitScript</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>script</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Скрипт который будет запущен для каждого дочернего
процесса в Apache. Это идельное место чтобы загружать
модули, создавать глобальные переменные, соединяться
с базами данных и все такое.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">ChildExitScript</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>script</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Скрипт который будет выполняться когда каждый
порожденный Apache процесс оканчивает работу.
Это идеальное место чтобы освобождать все ресурсы
занятые в
ChildInitScript.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">BeforeScript</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>script</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Скрипт который будет выполняться перед тем как сервер
запустит .rvt страницу. Может быть использован для
того, чтобы, например, создавать стандарный header
(в терминологии http, например - image/png). Также
может быть использован для того чтобы подгружать
код который будет использоваться на каждой странице,
если вы не хотите это делать в
GlobalInitScript
ChildInitScript когда вы
разрабатываете веб сайт в первый раз (примечание переводчика: не понимаю, о чем это
он? последняя строка - построчник)
<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">
Этот код исполняется на глобальном уровне, а не
в том namespace в котором исполняются страницы
</td></tr></table></div>
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">AfterScript</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>script</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Скрипт который будет вызываться после каждой (.rvt) страницы.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">ErrorScript</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>script</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Если внутри rivet произойдет ошибка, то он
сооружает некую html-страницу с информацией о том, что
собственно, произошло. Если же ErrorScript
указан, то можно создать свою страницу, которая будет
вызываться в этом случае. Это может быть полезно
когда вы не хотите показывать пользователю свой
код с ошибками.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">UploadDirectory</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>directory</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">Директория в которую надо складывать загруженые (uploaded) пользователем файлы.</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">UploadMaxSize</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>size</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">Максимальный размер для загруженных (uploaded) файлов.</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">UploadFilesToVar</span>? (<span style="font-family:monospace; font-weight: bold;">yes</span> | <span style="font-family:monospace; font-weight: bold;">no</span>)</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Эта установка регулирует возможность закачки (upload)
файлов прямо в Tcl переменную. Если у вас установлено
ограничение по размеру на закачиваемые файлы, а вам
не особенно хочется общаться со слишком большими файлами,
то эта установка позволяет вам складывать их на диск.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">SeperateVirtualInterps</span>? (<span style="font-family:monospace; font-weight: bold;">yes</span> | <span style="font-family:monospace; font-weight: bold;">no</span>)</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Если эта опция установлена, то rivet будет создавать
отдельный интерпретатор Tcl на каждый VirtualHost
в терминологии Apache. Это полезно в ситуации когда
вы - хостер и надо чтобы для каждого клиента был свой
собственный интерпретатор, чтобы они друг с другом
не конфликтовали.
</div></div></dd></dl></div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">RivetDirConf</span> (<span style="font-family:monospace; font-weight: bold;">BeforeScript</span> | <span style="font-family:monospace; font-weight: bold;">AfterScript</span> | <span style="font-family:monospace; font-weight: bold;">ErrorScript</span> | <span style="font-family:monospace; font-weight: bold;">UploadDirectory</span>)</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Эта установка - тоже самое что
<span style="font-family:monospace"><span><b class="command">RivetServerConf</b></span></span>,
кроме того что они касаются только той директории
в которой они указаны, и ее поддиректорий.
Можно использовать в
<span style="font-family:monospace"><span><b class="command">Directory</b></span></span> разделах.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">RivetUserConf</span> (<span style="font-family:monospace; font-weight: bold;">BeforeScript</span> | <span style="font-family:monospace; font-weight: bold;">AfterScript</span> | <span style="font-family:monospace; font-weight: bold;">ErrorScript</span> | <span style="font-family:monospace; font-weight: bold;">UploadDirectory</span>)</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Эти опции - то же самое что и
<span style="font-family:monospace"><span><b class="command">RivetServerConf</b></span></span>,
кроме лишь того что они действуют только для указанной
директории, и ее поддиректорий
</div></div></dd></dl></div></div><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="commands"></a>Rivet: Tcl команды и переменные</h2></div></div></div><div class="toc"><dl><dt><a href="#id4745521">var</a> - get the value of a form variable.</dt><dt><a href="#id4746010">upload</a> - предназначена для обработки закачанных (uploaded)
файлов.</dt><dt><a href="#id4746433">load_response</a> - Сохряняет переданные данные в массиве.</dt><dt><a href="#id4746481">load_env</a> - Загужает переменные окружения (environment).</dt><dt><a href="#id4746563">load_headers</a> - Загружает заголовки (headers) из запроса (requestа).</dt><dt><a href="#id4746622">load_cookies</a> - Загружает клиентские cookie.</dt><dt><a href="#id4746679">include</a> - Считывает файл без всякой модификации.</dt><dt><a href="#id4746738">parse</a> - обрабатывает файл Rivetом.</dt><dt><a href="#id4746802">headers</a> - установка и обработка заголовков HTTP.</dt><dt><a href="#id4747132">makeurl</a> - Формирует url'и основываясь на hostname, port.</dt><dt><a href="#id4747202">cookie</a> - работает с cookies.</dt><dt><a href="#id4747369">clock_to_rfc850_gmt</a> - Возвращает время согласно rfc850 основываясь на [clock seconds].</dt><dt><a href="#id4747424">html</a> - создает html выделения в тексте.</dt><dt><a href="#id4747499">incr0</a> - увеличивает переменную на 1 или делает ее равной 1 если переменная не существовала.</dt><dt><a href="#id4747575">parray</a> - команда Tcl's parray с html-форматированием.</dt></dl></div><div class="refentry" lang="ru"><a name="id4745521"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">var, var_qs, var_post — get the value of a form variable.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">
var
</span> (<span style="font-family:monospace; font-weight: bold;">get</span> | <span style="font-family:monospace; font-weight: bold;">list</span> | <span style="font-family:monospace; font-weight: bold;">exists</span> | <span style="font-family:monospace; font-weight: bold;">number</span> | <span style="font-family:monospace; font-weight: bold;">all</span>)</div></div><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">
var_qs
</span> (<span style="font-family:monospace; font-weight: bold;">get</span> | <span style="font-family:monospace; font-weight: bold;">list</span> | <span style="font-family:monospace; font-weight: bold;">exists</span> | <span style="font-family:monospace; font-weight: bold;">number</span> | <span style="font-family:monospace; font-weight: bold;">all</span>)</div></div><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">
var_post
</span> (<span style="font-family:monospace; font-weight: bold;">get</span> | <span style="font-family:monospace; font-weight: bold;">list</span> | <span style="font-family:monospace; font-weight: bold;">exists</span> | <span style="font-family:monospace; font-weight: bold;">number</span> | <span style="font-family:monospace; font-weight: bold;">all</span>)</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Команда <span style="font-family:monospace"><span><b class="command">var</b></span></span>
предназначена для доступа к переменным которые были
переданы методами GET или POST, не делая между
ними никакой разницы. Стоит заметить что есть еще две
формы команды <span style="font-family:monospace"><span><b class="command">var</b></span></span>:
<span style="font-family:monospace"><span><b class="command">var_qs</b></span></span> и <span style="font-family:monospace"><span><b class="command">var_post</b></span></span>.
Эти команды рассматривают только переменные переданные
GETом и POSTом, соответственно.
</p><div class="variablelist"><dl><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">get</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>varname</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>?<span class="optional">default</span>?</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает значение переменной
<i class="replaceable"><tt>varname</tt></i>
как строку, причем даже в случае когда у переменной есть
несколько значений
Если же такой переменной
не было передано - то возвращается
<i class="replaceable"><tt>?<span class="optional">default</span>?</tt></i>,
а если и оно не было указано - то "" - пустая строка.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">list</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>varname</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает значение переменной
<i class="replaceable"><tt>varname</tt></i>
как список, если для этой переменной было много значений.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">exists</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>varname</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает 1 если
<i class="replaceable"><tt>varname</tt></i>
вам передана, и 0 если нет.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">number</span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает количество переменных.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">all</span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает список из имен переменных и их значений.
</div></div></dd></dl></div><p style="width:90%">
См. так же <a href="#variable_access" title="Пример 3. Доступ к переменным">Пример3, Доступ к переменным</a>.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746010"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">upload — предназначена для обработки закачанных (uploaded)
файлов.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">upload</span> (<span style="font-family:monospace; font-weight: bold;">channel</span> | <span style="font-family:monospace; font-weight: bold;">save</span> | <span style="font-family:monospace; font-weight: bold;">data</span> | <span style="font-family:monospace; font-weight: bold;">exists</span> | <span style="font-family:monospace; font-weight: bold;">size</span> | <span style="font-family:monospace; font-weight: bold;">type</span> | <span style="font-family:monospace; font-weight: bold;">filename</span>)</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%"> Команда upload предназначена для обработки закачанных (uploaded)
файлов. Обратите внимание что поведение этой команды зависит от конфигурации Apache и Rivet.
</p><div class="variablelist"><dl><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">channel</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>uploadname</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Если передано имя закачанного файла, то
<i class="replaceable"><tt>uploadname</tt></i>,
возвращает Tcl handle (как open (?)) для обращения
к этому файлу.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">save</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>uploadname</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>filename</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Сохраняет
<i class="replaceable"><tt>uploadname</tt></i> в
файле
<i class="replaceable"><tt>filename</tt></i>.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">data</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>uploadname</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает данные загруженные на сервер. Должно
работать так же и с бинарными файлами.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">size</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>uploadname</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает размер закачанного файла.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">type</span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает значение <tt class="varname">Content-type</tt>, если оно установлено,
или пустую строчку, если нет.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">filename</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>uploadname</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает имя закачанного файла на клиентской машине.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">names</span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Возвращает список имен переменных для всех закачанных файлов
</div></div></dd></dl></div><p style="width:90%">
См. так же <a href="#upload" title="Пример 4. Закачка файлов (Upload)">Пример4, Закачка файлов (Upload)</a>.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746433"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">load_response — Сохряняет переданные данные в массиве.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">load_response</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>arrayName</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3>
Сохраняет в массиве все переменные, переданные из формы
</div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746481"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">load_env — Загужает переменные окружения (environment).</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">load_env</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>array_name</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Загружает в указанный массив переменные окружения. По умолчанию
делает это в массив ::request::env
</p><p style="width:90%">
Так как страницы выполняются в пространстве имен
::request, то нет необходимости
обращатся к этому массиву по полному имени - вполне
можно ограничиться просто
env (примечание переводчика: щааааз!).
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746563"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">load_headers — Загружает заголовки (headers) из запроса (requestа).</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">load_headers</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>array_name</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Загужает клиентские HTTP заголовки в указанный массив, или в
headers если имя массива не указано.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746622"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">load_cookies — Загружает клиентские cookie.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">load_cookies</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>array_name</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3></div><p style="width:90%">
Загужает переданные клиентом Cookie в указанный массив, или в
headers если имя массива не указано.
</p></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746679"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">include — Считывает файл без всякой модификации.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">include</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>filename_name</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Подгружает файл без обратки тэгов
<? и ?>. Это лучший способ включить HTML файл
или другой статический контент.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746738"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">parse — обрабатывает файл Rivetом.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">parse</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>filename</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Почти то же что и команда Tcl <span style="font-family:monospace"><span><b class="command">source</b></span></span>, но только
с учетом тегов <? и ?>, используемых Rivetом. Этой командой можно
вызывать один .rvt файл из другого.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4746802"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">headers — установка и обработка заголовков HTTP.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">headers</span> (<span style="font-family:monospace; font-weight: bold;">set</span> | <span style="font-family:monospace; font-weight: bold;">redirect</span> | <span style="font-family:monospace; font-weight: bold;">add</span> | <span style="font-family:monospace; font-weight: bold;">type</span> | <span style="font-family:monospace; font-weight: bold;">numeric</span>)</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Команда <span style="font-family:monospace"><span><b class="command">headers</b></span></span> предназначена для работы с заголовками http.
</p><div class="variablelist"><dl><dt><span class="term"><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">set</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>headername</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>value</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Устанавливает разнообразные заголовки и значения.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">redirect</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>uri</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Перенаправление (redirect) с текущей страницы на новый URI.
<span class="emphasis"><em>Обязана</em></span> быть в самом начале кода.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">add</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>headername</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>value</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">Добавляет текст в заголовок
<tt class="varname">headername</tt>.</div></div></dd><dt><span class="term"><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">type</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>content-type</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">
Эта команда устанавливает HTTP заголовок
<tt class="constant">Content-type</tt> который возвращается
клиенту при обращении к странице. Это полезно если вы
отдаете содержимое отличное от text/html или
указываете кодировку.
</div></div></dd><dt><span class="term">
<div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex ">?<span style="font-family:monospace; font-weight: bold;">numeric</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>response code</tt></i></span>?</div></div>
</span></dt><dd><div style="padding:4 ; margin-top:3 ; margin-bottom:3 ; width:75%"><div style="margin-bottom:1.5ex ; padding .5ex">Устанавливает код http-ответа, типа 200, 404 или 500.
</div></div></dd></dl></div></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4747132"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">makeurl — Формирует url'и основываясь на hostname, port.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">makeurl</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>filename</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Создает URL который ссылается сам на себя исходя из имени
файла. Например,
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">makeurl /tclp.gif</pre><p style="width:90%">
вернет
<tt class="computeroutput">http://[hostname]:[port]/tclp.gif</tt>.
взяв информацию о hostname и порте из достоверного источника
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4747202"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">cookie — работает с cookies.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">cookie</span> ?<span style="font-family:monospace; font-weight: bold;">set</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>cookieName</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>?<span class="optional">cookiValue</span>?</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;">-days <i class="replaceable"><tt>expireInDays</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;">-hours <i class="replaceable"><tt>expireInHours</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;">-minutes <i class="replaceable"><tt>expireInMinutes</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;">-expires <i class="replaceable"><tt>Wdy, DD-Mon-YYYY HH:MM:SS GMT</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;">-path <i class="replaceable"><tt>uriPathCookieAppliesTo</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;">-secure <i class="replaceable"><tt>1/0</tt></i></span>?</div></div><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">cookie</span> ?<span style="font-family:monospace; font-weight: bold;">get</span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>cookieName</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Эта команда преденазаначена для установки или
считывания переданных Cookies. Когда вам передают
cookie, эта команда вам передает значение, или же
пустую строку, если вам такую cookie не передали.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4747369"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">clock_to_rfc850_gmt — Возвращает время согласно rfc850 основываясь на [clock seconds].</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">clock_to_rfc850_gmt</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>seconds</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Конвертирует unix-time (количество секунд с 1970 года) в
формат RFC850, который требует чтобы оно было GMT.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4747424"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">html — создает html выделения в тексте.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">html</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>string</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>arg</tt></i></span>...?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Выводит текст с возможностию передачи HTML тэгов, переданных
как аргументы. Пример:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting">html "Test" b i</pre><p style="width:90%">
produces: <tt class="computeroutput"><b><i>Test</i></b></tt>
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4747499"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">incr0 — увеличивает переменную на 1 или делает ее равной 1 если переменная не существовала.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">incr0</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>varname</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>num</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Прибавляет 1 к
<i class="replaceable"><tt>varname</tt></i>
<i class="replaceable"><tt>num</tt></i> раз.
Если такой переменной не существовало, то создает таковую
и присваивает ей 1, а не возвращает ошибку.
</p></div></div><div class="refentry" lang="ru"><div class="refentry.separator"><hr></div><a name="id4747575"></a><div class="titlepage"></div><div class="refnamediv"><h3>Название</h3><p><h3 style="text-indent: 3em">parray — команда Tcl's <span style="font-family:monospace"><span><b class="command">parray</b></span></span> с html-форматированием.</h3></p></div><div class="refsynopsisdiv"><h3>Синтаксис</h3><div class="cmdsynopsis" style="width:80%"><div style="background:#bbbbff ; margin:1ex ; padding:.4ex ; word-spacing:1ex "><span style="font-weight:bold ; font-family:monospace">parray</span> ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>arrayName</tt></i></span>? ?<span style="font-family:monospace; font-weight: bold;"><i class="replaceable"><tt>?<span class="optional">pattern</span>?</tt></i></span>?</div></div></div><div class="refsect1" lang="ru"><h3>Описание</h3><p style="width:90%">
Версия стандартной команды Tcl
<span style="font-family:monospace"><span><b class="command">parray</b></span></span>. Делает то же самое, но с
красивым html оформлением.
</p></div></div></div><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="examples"></a>Примеры использования</h2></div></div></div><p style="width:90%">
Далее - примеры использования Rivet. Подразумевается что
читатель имеет некоторые знания Tcl. Если же вы его не знаете -
не волнуйтесь, это простой язык, и множество как минимум англоязычной
документации и учебников доступно в сети.
Посмотрите например <a href="#websites" title="Веб сайты"> сюда </a>.
</p><div class="example"><a name="hello world"></a><p class="title"><b>Пример 1. Hello World</b></p><p style="width:90%">
Естественно, первым примером будет "Hello World".
</p><p style="width:90%">
Мы предполагаем что к этому моменту Apache сконфигурирован и понимает
.rvt файлы, создадим файл
<tt class="filename">hello.rvt</tt> в месте где Apache сможет
его найдти со следующим содержимым:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting"><?
puts "Hello World"
?>
</pre><p style="width:90%">
Если вы обратитесь к этому файлу через броузер, вы должны увидеть
практически чистую страницу с надписью "Helo World" (без кавычек).
</p></div><div class="example"><a name="table"></a><p class="title"><b>Пример 2. Создание таблицы</b></p><p style="width:90%">
В следующем, тоже простом примере мы покажем как создать таблицы:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting"><? puts "<table>\n"
for {set i 1} { $i <= 8 } {incr i} {
puts "<tr>\n"
for {set j 1} {$j <= 8} {incr j} {
set num [ expr $i * $j * 4 - 1]
puts [ format "<td bgcolor=\"%02x%02x%02x\" > $num $num $num </td>\n" \
$num $num $num ]
}
puts "</tr>\n"
}
puts "</table>\n" ?>
</pre><p style="width:90%">
Если вы вчитаетесь в код, то убедитесь что это чистейший Tcl. Мы можем
запустить этот код и вне Rivet - и он будет генерировать такой же HTML!
</p><p style="width:90%">
Результат должен быть похож на:
</p><div><img src="table.png"></div></div><div class="example"><a name="variable_access"></a><p class="title"><b>Пример 3. Доступ к переменным</b></p><p style="width:90%">
А тут мы продемонстрируем как обращаться с переменными
переданными вам методом POST или GET.
</p><p style="width:90%">
Из такой HTML формы:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting"> <form action="vars.rvt">
<table>
<tbody>
<tr>
<td><b>Title:</b></td>
<td><input name="title"></td>
</tr>
<tr>
<td><b>Salary:</b></td>
<td><input name="salary"></td>
</tr>
<tr>
<td><b>Boss:</b></td>
<td><input name="boss"></td></tr>
<tr>
<td><b>Skills:</b></td>
<td>
<select name="skills" multiple="multiple">
<option>c</option>
<option>java</option>
<option>Tcl</option>
<option>Perl</option>
</select>
</td>
</tr>
<tr>
<td><input type="submit"></td>
</tr>
</tbody>
</table>
</form>
</pre><p style="width:90%">
Мы можем использовать rivet скрипт чтобы получить доступ к
этим переменным:
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting"><?
set errlist {}
if { [var exists title] } {
set title [var get title]
} else {
set errlist "You need to enter a title"
}
if { [var exists salary] } {
set salary [var get salary]
if { ! [string is digit $salary] } {
lappend errlist "Salary must be a number"
}
} else {
lappend errlist "You need to enter a salary"
}
if { [var exists boss] } {
set boss [var get boss]
} else {
set boss "Mr. Burns"
}
if { [var exists skills] } {
set skills [var list skills]
} else {
lappend errlist "You need to enter some skills"
}
if { [llength $errlist] != 0 } {
foreach err $errlist {
puts "<b> $err </b>"
}
} else {
puts "Thanks for the information!"
?>
<table>
<tbody>
<tr>
<td><b>Title:</b></td>
<td><? puts $title ?></td>
</tr>
<tr>
<td><b>Boss:</b></td>
<td><? puts $boss ?></td>
</tr>
<tr>
<td><b>Salary:</b></td>
<td><? puts $salary ?></td>
</tr>
<tr>
<td><b>Skills:</b></td>
<td><? puts $skills ?></td>
</tr>
</tbody>
</table>
<?
}
?>
</pre><p style="width:90%">
Первый оператор проверяет что переменная
<tt class="varname">boss</tt> была переданна скрипту, и потом
что-то делает с этой информацией.
Если же такой нет - то в список ошибок добавляется сообщение
об этом прискорбном факте.
</p><p style="width:90%">
Во втором куске кода, переменная
<tt class="varname">salary</tt> обрабатывается примерно таким же
образом, и к тому же еще и проверяется на то является ли она
числом.
</p><p style="width:90%">
Если переменная <tt class="varname">boss</tt> не введена - то она
заменяется на "Mr. Burns".
</p><p style="width:90%">
А последний кусок кода немножко хитрее, потому что переменная
<tt class="varname">skills</tt> - это listbox, и в принципе
может иметь несколько значений, и тут мы покажем как с ними
поступать.
</p><p style="width:90%">
Скрипт далее проверяет что
<tt class="varname">errlist</tt> пустой (а если нет - то информирует
вас об ошибках) и говорит что спасибо и все такое.
</p></div><div class="example"><a name="upload"></a><p class="title"><b>Пример 4. Закачка файлов (Upload)</b></p><p style="width:90%">
Пусть есть такой HTML код
<tt class="filename">upload.html</tt>
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting"><form action="foo.rvt" enctype="multipart/form-data" method="post">
<input type="file" name="MyUpload"></input>
<input type="submit" value="Send File"></input>
</form>
</pre><p style="width:90%">
Из такого Tcl кода, например,
(под названием <tt class="filename">upload.rvt</tt>)
мы получаем доступ к загруженному файлу.
</p><pre style="background:#bbffbb ; width:90ex ; margin: 2ex ; padding: 1ex; border: solid black 1px ; white-space: pre; font-family:monospace ; " class="programlisting"><?
upload save MyUpload /tmp/uploadfiles/file1
puts "Saved file [upload filename MyUpload] \
([upload size MyUpload] bytes) to server"
?></pre></div></div><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="tcl_packages"></a>Rivet Tcl packagы</h2></div></div></div><p style="width:90%">
Кроме всего прочего, Rivet - это еще и набор полезных
packageй.
</p><div class="itemizedlist"><ul type="disc"><li><div style="margin-bottom:1.5ex ; padding .5ex">commserver - это package который может быть использован при
IPC. Страшно экспериментальный. Ему нужен comm из tcllib
</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">dio - абстрактный интерфейс работы с базами данных.</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">dtcl - модуль для обеспечения совместимости с mod_dtcl
</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">form - для создания forms.</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">rivet - еще куча полезных процедур.</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">tclrivet</div></li></ul></div></div><div class="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="help"></a>Ресурсы и как получить помощь</h2></div></div></div><div class="toc"><dl><dt><span class="section"><a href="#id4748152">Mailing Lists</a></span></dt><dt><span class="section"><a href="#id4747950">Новостная группа</a></span></dt><dt><span class="section"><a href="#websites">Веб сайты</a></span></dt><dt><span class="section"><a href="#id4748060">Система отлова ошибок</a></span></dt><dt><span class="section"><a href="#id4748336">IRC</a></span></dt><dt><span class="section"><a href="#id4748351">Редактирование Rivet файлов</a></span></dt></dl></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4748152"></a>Mailing Lists</h3></div></div></div><p style="width:90%">
Mailing List (список рассылка) - это первейшее место куда
надо обращаться за помощью, если, конечно, вы не нашли ответа
в документации. Пишите на
<tt class="email"><<a href="mailto:rivet-user@tcl.apache.org">rivet-user@tcl.apache.org</a>></tt>. Если у вас
есть мысли, идеи, или просто соображения о Rivet и его коде, то
пишите на <tt class="email"><<a href="mailto:rivet-dev@tcl.apache.org">rivet-dev@tcl.apache.org</a>></tt>.
Чтобы подписаться на оба листа, пишите email на
<tt class="email"><<a href="mailto:rivet-list-subscribe@tcl.apache.org">rivet-<i class="replaceable"><tt>list</tt></i>-subscribe@tcl.apache.org</a>></tt>.
</p><p style="width:90%">
Архивы списка рассылки доступны тут <a href="http://nagoya.apache.org/eyebrowse/SummarizeList?listId=118" target="_top">http://nagoya.apache.org/eyebrowse/SummarizeList?listId=118</a>
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4747950"></a>Новостная группа</h3></div></div></div><p style="width:90%">
Новостная группа <a href="news:comp.lang.tcl" target="_top">news:comp.lang.tcl</a> - это хорошее
место для вопросов по Tcl вообще. Но и разработчики Rivet туда
тоже заглядывают, можно и туда писать, но лучше в список рассылки.
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="websites"></a>Веб сайты</h3></div></div></div><p style="width:90%">
Есть некоторое количество полезных веб сайтов про Apache и Tcl.
</p><div class="itemizedlist"><ul type="disc"><li><div style="margin-bottom:1.5ex ; padding .5ex">
<a href="http://tcl.apache.org" target="_top">http://tcl.apache.org</a>
это домашняя страница проекта Apache Tcl. Сюда надо ходить за
свежими версиями софта.
</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">
<a href="http://httpd.apache.org/docs/" target="_top">http://httpd.apache.org/docs/</a>
по всем вопросам касающимся Apache
</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">
<a href="http://www.tcl.tk/" target="_top">http://www.tcl.tk/</a>
классическое место где гнездится Tcl.
</div></li><li><div style="margin-bottom:1.5ex ; padding .5ex">
<a href="http://wiki.tcl.tk" target="_top">http://wiki.tcl.tk</a>
Tcl's Wiki, весьма полезный ресурс для задавания вопросов,
получения ответов и отвечания на них для тех кто крут.
</div></li></ul></div></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4748060"></a>Система отлова ошибок</h3></div></div></div><p style="width:90%">
Apache Rivet использует ВсеАпачную Систему Отлова Ошибок (ВАСОО) <a href="http://nagoya.apache.org/bugzilla/" target="_top">http://nagoya.apache.org/bugzilla/</a>.
Всякие проблемы пишите сюда, или - что тоже полезно - вы можете
выяснить опыт ее решения, если кто-то уже с ней сталкивался.
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4748336"></a>IRC</h3></div></div></div><p style="width:90%">
Иногда случается что кто-то из команды Rivet доступен по IRC
на irc.freenode.net, канал #tcl.
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4748351"></a>Редактирование Rivet файлов</h3></div></div></div><p style="width:90%">
Для двух популярных редакторов
<span class="application">emacs</span> и
<span class="application">vim</span> есть код для удобного редактирования
файлов Rivet. Идея в том что редактор, завидев теги
<? and ?> переключается то в режим HTML, то в Tcl.
Эти файлы
<tt class="filename">two-mode-mode.el</tt> и
<tt class="filename">rvt.vim</tt> находятся в директории
<tt class="filename">contrib/</tt>.
</p></div></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="#id4748430">Инициализация</a></span></dt><dt><span class="section"><a href="#id4748494">RivetChan</a></span></dt><dt><span class="section"><a href="#id4748540">Команда <span style="font-family:monospace"><span><b class="command">global</b></span></span></a></span></dt><dt><span class="section"><a href="#id4748626">Обработка страниц, выполнение и кеширование</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="id4748430"></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="id4748494"></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="id4748540"></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="id4748626"></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="section" lang="ru"><div class="titlepage"><div><div><hr><h2 class="title" style="clear: both"><a name="upgrading"></a>Переход с mod_dtcl или NeoWebScript (NWS)</h2></div></div></div><div class="toc"><dl><dt><span class="section"><a href="#id4748735">mod_dtcl</a></span></dt><dt><span class="section"><a href="#id4748754">NeoWebScript</a></span></dt></dl></div><p style="width:90%">
Обратная совместимость не была никогда особой целью разработчиков,
но мы ее все равно предоставляем по историческим причинам и
с учетом пожеланий тех кто переключается на Rivet с mod_dtcl и NeoWebScript (NWS).
</p><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4748735"></a>mod_dtcl</h3></div></div></div><p style="width:90%">
Rivet базируется на коде mod_dtcl, но достаточно хорошо переработан. Основная
идея осталась та же, но большое количетво команд изменилось.
</p></div><div class="section" lang="ru"><div class="titlepage"><div><div><h3 class="title"><a name="id4748754"></a>NeoWebScript</h3></div></div></div><p style="width:90%">Потом.</p></div></div></div></body></html>
|