用vbs等实现辅助网站的后台运行工作进程

来源:互联网 发布:最难防范的网络攻击 编辑:程序博客网 时间:2024/05/29 18:50

做网站的同学相比都对自动后台运行的工作进程十分垂涎,因为不管什么网站脚本语言,ASP、PHP等,都是当客户来申请的时候才会有动作,而所有动作都得客户耗着等。这时候如果有一个后台运行的工作进程帮你处理一些东西该多好啊,比如说清理下垃圾啦、异步处理一些很耗时的工作啦等等。


因为是Windows服务器,SQL Server数据库,网站语言用的是ASP的VBScript,所以我考虑采用vbs作为工具实现这种后台运行的功能。(vbs就是VBScript嘛,所以语言习惯上比较像。如果你网站是php,用的是linux服务器,可以适当选择其他比较像的语言来做啦,道理是一样的)


//TODO:来一张图说明一下总体架构吧。


因为比较简单,所以设计好之后,我们就开工吧:


第一步


首先我们来建一个表,用来作为后台进程和监控进程通讯的中介,也可以作为出错时检查的日志。取名 logAutoTasks。


虽然用数据库作为中介,开销是比较大的,有朋友建议我用ping包,但是,vbs哪有什么ping包之类的,只能选择开销大一些的咯,再者,反正日志总是要记的,相当于两者工作一次做掉,应该也是个好办法吧。


taskId是每个不同的进程所使用不同的ID号,logTime记录最后活动的时间,也就是这条日志记录的时间,Operate是活动的内容,如果动作复杂,可以用来追踪进程的具体动作。

记得给logTime上索引哦,要不然表大了之后会拖累整个系统的。(我用的还是SQL Server 2000,凑合着看看吧,其他版本应该也差不多。)新建一个叫IX_logAutoTasks_time的索引,这里选择降序很重要,因为每次我们查询的时候总是查最近的状态记录,所以降序的话,一开始就找到了,如果升序的话,要从索引的另一头开始找,会慢哦。



好了,保存表备用。


第二步


写一个最简单的后台运行的vbs类。这个程序就两个动作,调用一个自己网站的网页,睡眠一段时间。


Class CTask'启动主函数'pTaskUrl工作页面地址'pIntervalTime工作与工作之间间隔时间Sub Run(pTaskUrl, pIntervalTime)Do While Truexhttp.HTML( pTaskUrl )WScript.Sleep( pIntervalTime )LoopEnd SubEnd Classdim taskset task = new CTask

这里用到的xhttp在另外一个vbs中定义。这里要解释下,为什么要这么麻烦的用While循环和On Error、Exit Do等语句把他包裹起来,这是因为VBScript中没有Try Catch语句,如果不考虑出错情况(比如网络断了啦、服务器没启动啦)的话,vbs就会想弹出一个错误对话框,然后等待用户点确定。但是,后台运行的vbs哪有人会给他点确定呢,所以我们就要避免vbs运行时出现错误然后一直就呆滞在那里等人点确定了。这里用While等包裹起来之后,意思其实就是如果出错,就直接跳到循环外去继续。这样就返回空。因为一次获取失败没什么的,反正一会儿又会来尝试,对吧。


Class CXHTTPDim userAgent, CookieSub setUserAgent( newUserAgent )userAgent = newUserAgentEnd SubSub setCookie( newCookie )Cookie = newCookieEnd Sub'收到二进制流转html字符串Private Function BytesToBstr( body ) 'Cset:GB2312 UTF-8 If Vartype(body)>0 Thendim objstream set objstream = CreateObject("adodb.stream") with objstream .Type = 1 ' .Mode = 3 ' .Open     .Write body  ' .Position = 0 ' .Type = 2  ' .Charset = "GB2312"  ' BytesToBstr = .ReadText ' .Close end with set objstream = nothing End IfEnd Function Function HTML( url )Dim httpDo While TrueOn Error Resume NextSet http = CreateObject("Msxml2.ServerXMLHTTP.6.0")if Err.Number<>0 Then gLog.LogError: Exit Dohttp.open "GET",url,falseif Err.Number<>0 Then gLog.LogError: Exit DoIf userAgent<>"" Then http.setRequestHeader "User-Agent", userAgentIf Cookie<>"" Then    http.setRequestHeader "Cookie", Cookiehttp.sendif Err.Number<>0 Then gLog.LogError: Exit DoHTML = BytesToBstr(http.responseBody)if Err.Number<>0 Then gLog.LogError: Exit DoExit DoLoopOn Error Goto 0Set http = NothingEnd FunctionEnd ClassDim xhttpSet xhttp = New CXHTTP

有了这两个vbs之后,再用一个WSF文件把他们连在一起。WSF(Windows Script Files),可以把多个脚本文件放到一起执行,避免一个文件写很长。

先写一个task1.wsf来跑跑试试吧。


<?xml version="1.0" encoding="UTF-8"?><job id="KeepAlive"><script language="VBScript" src="../inc/xhttp.vbs" /><script language="VBScript" src="../inc/task.vbs" /><script language="VBScript">task.Run "http://localhost/?iamhere", 1000</script></job>

双击下,运行试试。嘿,他是不是悄声无息的就那么在后台运行了。打开任务管理器看看,有一个叫wscript.exe的进程,就是他了。




因为双击vbs、wsf程序,Windows默认是用wscript.exe来执行他的,相当于命令行 C:\Windows\System32\wscript.exe C:\code\vbs\AutoTasks\task1.wsf 的效果。

那他有没有在运行呢,我们再打开IIS的日志来看看。



他来了。1秒钟一次。这个频率肯定有点高,但是测试的时候我总是喜欢快一点,等到正式要上线了,我们再把间隔时间拉长。


先写到这里,后面还有如何用instsrv.exe和srvany.exe把这个vbs作为服务安装,以及网页端如何记录日志,以及监控程序如何判断后台进程不正常而重启服务。


0 0
原创粉丝点击