Websh ได้รับการพัฒนาโดย Netcetera AG ประเทศสวิตเซอร์แลนด์ และมีส่วนร่วมในมูลนิธิซอฟต์แวร์ Apache ในปี 2544
เวอร์ชันล่าสุดคือ Websh 3.6.0b5 (2009-09-14)
น่าเสียดายที่ Apache "ยุติการสนับสนุนและการพัฒนา Websh เนื่องจากขาดทรัพยากร"
Tcl เป็นภาษาโปรแกรมที่ดีในแง่ที่ว่าเป็นภาษาแทนโปรแกรมเป็นรายการคำสั่ง ซึ่งคล้ายกับภาษาธรรมชาติของเรา
Tcl ยังทรงพลังด้วยแนวคิดการเขียนโปรแกรม "แฟนซี" มากมายที่เริ่มตั้งแต่วันแรกๆ
แนวคิดในการใช้ Tcl สำหรับการเขียนโปรแกรมเว็บนั้นเป็นเรื่องปกติ Websh เป็นหนึ่งในความพยายามดังกล่าว
Websh สามารถใช้ได้ด้วยวิธีใดวิธีหนึ่งดังต่อไปนี้ 4 วิธี:
แม้ว่าเดิมที Websh ได้รับการออกแบบมาสำหรับเว็บ แต่ฉันพบว่าการใช้ที่อื่นก็มีประโยชน์เช่นกัน
แนวคิดหลักที่นี่คือ "คำสั่ง" เช่นเดียวกับที่อยู่ใน Tool Command Language (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 Extension Architecture) ที่สามารถโหลดแบบไดนามิกจากภายใน Tcl โดยใช้ [load libwebsh3.6..so] ทั้งสองมี websh แพ็คเกจ Tcl เป้าหมายที่สามคือ 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 สามารถนำมาใช้ซ้ำระหว่างแต่ละคำขอ
คุณสมบัตินี้สามารถช่วยเพิ่มเวลาตอบสนองของสคริปต์เว็บได้อย่างมาก
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