Websh был первоначально разработан компанией Netcetera AG, Швейцария, и передан в Apache Software Foundation в 2001 году.
Самая последняя версия — Websh 3.6.0b5 (14 сентября 2009 г.).
К сожалению, Apache «прекратил поддержку и разработку Websh из-за нехватки ресурсов».
Tcl — хороший язык программирования в том смысле, что он представляет программу в виде списка команд, что похоже на наш естественный язык.
Tcl также обладает множеством «причудливых» концепций программирования, доступных уже с самых первых дней.
Идея использования Tcl для веб-программирования естественна. Websh является одним из таких проектов.
Websh можно использовать одним из четырех способов:
Хотя Websh изначально разрабатывался для Интернета, я обнаружил, что его полезно использовать и в других местах.
Ключевым понятием здесь является «команда», как и в языке Tool Command Language (Tcl).
Вебш-скрипт hello world выглядит так, как показано ниже. web::command
и web::dispatch
— две основные команды.
web::command hello {
web::put " hello "
}
web::command world {
web::put " world "
}
web::dispatch
Websh — это чистое расширение Tcl. Процесс сборки аналогичен
cd src/unix
autoconf
./configure
--with-tclinclude=/usr/include/tcl
--with-httpdinclude=/usr/include/apache2
--enable-threads
make
make test
make apachetest
make install
Make создаст три цели: websh3.6., которое представляет собой автономное приложение Websh (динамически связанное с Tcl и libwebsh3.6..so) и libwebsh3.6..so, которое представляет собой общий объект, совместимый с TEA (архитектура расширений Tcl). его можно динамически загружать из Tcl с помощью [load libwebsh3.6..so]. Оба предоставляют пакет Tcl websh. Третья цель — mod_websh3.6..so (также динамически связанный с Tcl и libwebsh3.6..so), который представляет собой модуль Websh Apache.
Приложения Websh могут работать либо в режиме CGI, либо через mod_websh
.
LoadModule websh_module /path/to/mod_websh.so
< IfModule websh_module>
WebshConfig /path/to/websh.conf
AddHandler websh .wsh
IfModule >
С mod_websh интерпретатор Tcl можно повторно использовать между каждым запросом.
Эта функция может значительно увеличить время отклика веб-скрипта.
set classid [web::interpclasscfg]
web::interpclasscfg $classid maxrequests 100 ; # handle at most 100 request
web::interpclasscfg $classid maxttl 600 ; # live at most 600 seconds
web::interpclasscfg $classid maxidletime 180 ; # idle at most 180 seconds
Поскольку интерпретатор можно использовать повторно, нам необходимо один раз настроить его в начале и очистить в конце.
# ----------------------------------------------------#
# web::initializer will execute in listed order #
# ----------------------------------------------------#
web::initializer {
web::logdest add user.-debug file -unbuffered /tmp/test.log
web::logfilter add *.-debug
web::log info " initializing interp "
}
# ----------------------------------------------------#
# web::finalizer will be executed in reverse order #
# ----------------------------------------------------#
web::finalizer {
web::log info " start shutting down interp "
}
web::finalizer {
web::log info " just before shutting down interp "
}
# ----------------------------------------------------#
# web::command will be dispatched from web::dispatch #
# ----------------------------------------------------#
web::command default {
web::put " hello "
web::putx /path/to/page.html
}
web::dispatch