Websh는 원래 스위스 Netcetera AG에서 개발되었으며 2001년에 Apache Software Foundation에 기부되었습니다.
최신 버전은 Websh 3.6.0b5(2009-09-14)입니다.
불행하게도 Apache는 "자원 부족으로 인해 Websh 지원 및 개발을 중단했습니다."
Tcl은 프로그램을 명령 목록으로 표현한다는 점에서 좋은 프로그래밍 언어입니다. 이는 자연 언어와 유사합니다.
Tcl은 또한 매우 짧은 순간부터 사용할 수 있는 많은 "멋진" 프로그래밍 개념을 갖추고 있어 강력합니다.
웹 프로그래밍에 Tcl을 사용한다는 아이디어는 자연스러운 일입니다. Websh는 그러한 노력 중 하나입니다.
Websh는 아래 4가지 방법 중 하나로 사용할 수 있습니다.
Websh는 원래 웹용으로 설계되었지만 다른 곳에서 사용하는 것도 유용하다는 것을 알았습니다.
여기서 핵심 개념은 Tcl(Tool Command Language)의 개념과 마찬가지로 "명령"입니다.
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는 독립형 Websh 애플리케이션(Tcl 및 libwebsh3.6..so에 동적으로 연결됨)인 websh3.6.과 TEA(Tcl Extension Architecture) 호환 공유 객체인 libwebsh3.6..so의 세 가지 대상을 생성합니다. [load libwebsh3.6..so]를 사용하여 Tcl 내에서 동적으로 로드할 수 있습니다. 둘 다 Tcl 패키지 websh를 제공합니다. 세 번째 대상은 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 해석기를 재사용할 수 있습니다.
이 기능은 웹 스크립트 응답 시간을 크게 향상시킬 수 있습니다.
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