Websh 最初由瑞士 Netcetera AG 開發,並於 2001 年貢獻給 Apache 軟體基金會。
最新版本是Websh 3.6.0b5 (2009-09-14)
不幸的是,Apache「因缺乏資源而停止了 Websh 支援和開發」。
Tcl 是一種很好的程式語言,因為它將程式表示為命令列表,這與我們的自然語言類似。
Tcl 也很強大,從很早開始就提供了許多「奇特」的程式設計概念。
使用 Tcl 進行 Web 程式設計的想法是很自然的。 Websh 就是這樣的努力之一。
Websh 可以透過以下 4 種方式之一使用:
儘管 Websh 最初是為 Web 設計的,但我發現在其他地方使用它也很有用。
這裡的關鍵概念是“命令”,就像工具命令語言(Tcl)中的命令一樣。
hello world Websh 腳本如下圖所示。 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 擴充架構)相容的共享物件可以使用 [load libwebsh3.6..so] 從 Tcl 動態載入。兩者都提供 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 解釋器可以在每個請求之間重複使用。
此功能可以大大提高 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