Websh 最初由瑞士 Netcetera AG 开发,并于 2001 年贡献给 Apache 软件基金会。
最新版本是Websh 3.6.0b5 (2009-09-14)
不幸的是,Apache“因缺乏资源而停止了 Websh 支持和开发”。
Tcl 是一种很好的编程语言,因为它将程序表示为命令列表,这与我们的自然语言类似。
Tcl 也很强大,从很早开始就提供了许多“奇特”的编程概念。
使用 Tcl 进行 Web 编程的想法是很自然的。 Websh 就是这样的努力之一。
Websh 可以通过以下 4 种方式之一使用:
尽管 Websh 最初是为网络设计的,但我发现在其他地方使用它也很有用。
这里的关键概念是“命令”,就像工具命令语言(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