Websh はもともとスイスの Netcetera AG によって開発され、2001 年に Apache Software Foundation に寄贈されました。
最新バージョンは Websh 3.6.0b5 (2009-09-14) です。
残念ながら、Apache は「リソース不足のため、Websh のサポートと開発を中止しました」。
Tcl は、プログラムをコマンドのリストとして表すという意味で優れたプログラミング言語であり、私たちの自然言語と似ています。
Tcl はまた、ごく最近から利用できる多くの「派手な」プログラミング概念を備えた強力なツールです。
Web プログラミングに Tcl を使用するという考えは自然です。 Websh もそのような取り組みの 1 つです。
Websh は、以下の 4 つの方法のいずれかで使用できます。
Websh はもともと Web 用に設計されましたが、他の場所で使用することも便利であることがわかりました。
ここでの重要な概念は、Tool Command Language (Tcl) の概念と同様に、「コマンド」です。
Hello World Websh スクリプトは以下のようになります。 web::command
とweb::dispatch
2 つの主要なコマンドです。
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 は、スタンドアロン Websh アプリケーション (Tcl および libwebsh3.6..so に動的にリンクされる) である websh3.6. と、TEA (Tcl Extension Architecture) 準拠の共有オブジェクトである libwebsh3.6.so の 3 つのターゲットを作成します。 [load libwebsh3.6..so] を使用して Tcl 内から動的にロードできます。どちらも Tcl パッケージ websh を提供します。 3 番目のターゲットは、Websh Apache モジュールである mod_websh3.6..so (これも Tcl および libwebsh3.6..so に動的にリンクされています) です。
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 インタープリターを各リクエスト間で再利用できます。
この機能により、Web スクリプトの応答時間が大幅に短縮されます。
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