تم تطوير Websh في الأصل بواسطة Netcetera AG، سويسرا وتم المساهمة به في مؤسسة Apache Software Foundation في عام 2001.
أحدث إصدار هو Websh 3.6.0b5 (2009-09-14)
لسوء الحظ، أباتشي "أوقف دعم Websh وتطويره بسبب نقص الموارد."
تعتبر Tcl لغة برمجة جيدة بمعنى أنها تمثل البرنامج كقائمة من الأوامر، وهو ما يشبه لغتنا الطبيعية.
تتميز Tcl أيضًا بالقوة مع توفر العديد من مفاهيم البرمجة "الرائعة" بدءًا من الأيام الأولى جدًا.
فكرة استخدام Tcl لبرمجة الويب أمر طبيعي. Websh هو أحد هذه الجهود.
يمكن استخدام Websh بإحدى الطرق الأربع التالية:
على الرغم من أن Websh مصمم في الأصل للويب، فقد وجدت أنه من المفيد أيضًا استخدامه في أي مكان آخر.
المفهوم الأساسي هنا هو "الأمر"، تمامًا مثل المفهوم الموجود في لغة أوامر الأداة (Tcl).
يبدو البرنامج النصي helloworld 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