Websh wurde ursprünglich von der Netcetera AG, Schweiz, entwickelt und 2001 zur Apache Software Foundation beigetragen.
Die neueste Version ist Websh 3.6.0b5 (14.09.2009)
Leider hat Apache „die Websh-Unterstützung und -Entwicklung aufgrund fehlender Ressourcen eingestellt“.
Tcl ist eine gute Programmiersprache in dem Sinne, dass es Programme als eine Liste von Befehlen darstellt, was unserer Natursprache ähnelt.
Tcl ist außerdem leistungsstark und bietet schon in jungen Jahren viele „ausgefallene“ Programmierkonzepte.
Die Idee, Tcl für die Webprogrammierung zu verwenden, liegt nahe. Websh ist einer dieser Bemühungen.
Websh kann auf eine der folgenden vier Arten verwendet werden:
Obwohl Websh ursprünglich für das Web entwickelt wurde, fand ich es auch nützlich, es an anderen Orten zu verwenden.
Das Schlüsselkonzept hier ist „Befehl“, genau wie das in der Tool Command Language (Tcl).
Ein Hallo-Welt-Websh-Skript sieht wie folgt aus. web::command
und web::dispatch
sind die beiden Hauptbefehle.
web::command hello {
web::put " hello "
}
web::command world {
web::put " world "
}
web::dispatch
Websh ist eine reine Tcl-Erweiterung. Der Build-Prozess ist ähnlich mit
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 erstellt drei Ziele: websh3.6., die eigenständige Websh-Anwendung (dynamisch verknüpft mit Tcl und libwebsh3.6..so) und libwebsh3.6..so, ein TEA-kompatibles (Tcl Extension Architecture) gemeinsames Objekt das dynamisch aus Tcl mit [load libwebsh3.6..so] geladen werden kann. Beide stellen das Tcl-Paket websh bereit. Das dritte Ziel ist mod_websh3.6..so (ebenfalls dynamisch mit Tcl und libwebsh3.6..so verknüpft), das Websh-Apache-Modul.
Websh-Anwendungen können entweder im CGI-Modus oder über mod_websh
ausgeführt werden.
LoadModule websh_module /path/to/mod_websh.so
< IfModule websh_module>
WebshConfig /path/to/websh.conf
AddHandler websh .wsh
IfModule >
Mit mod_websh kann der Tcl-Interpreter zwischen den einzelnen Anfragen wiederverwendet werden.
Diese Funktion kann die Reaktionszeit von Webskripten erheblich steigern.
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
Da der Interpreter wiederverwendet werden kann, müssen wir ihn zu Beginn einmal einrichten und am Ende bereinigen.
# ----------------------------------------------------#
# 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