一个是Daviv的,用ASP代理读取远程文件,用JS解析XML。
另一个是Wewill.cn的,这个就比较复杂,采用了大量的AJAX技术,并用XML文档保存临时数据。用起来感觉相当不错。
当然还有SXNA,技术比较老套,但考虑却相对周到,而且不采用即时解析。
还看了一些有关静态化的资料。最后有了下面的一些想法:
即时解析是肯定不行的,不论采用何种解析方式,如何保存临时数据,在阅读每个Feed时连接远程服务器都是免不了的。可能根本连不上,可能很慢,就算很顺利还是要时间要资源。一个虚拟主机有多少资源可以消耗呢?
看来只能用间隔更新,保存数据,然后阅读时再调用。
用什么方式保存数据呢?Access是一种,SXNA就是这样,但直接读取Access数据库是一件越来越让人主观上失望的事情,何况数据条目并不多,用据库也并无明显的优点。XML也可以,但这样还是离不了解析过程,如果XML文件很大,这个过程会很麻烦。当然可以用JS解析,我不信任AJAX。AJAX也不值得信任(以后再说)。
不如用个更直接的办法,静态化。就连FeedDemo这样的本地程序都会在Temp文件夹里生成大量的HTML文件(或者很聪明也或者很傻),何况对于Web程序,静态化对于搜索引擎更友好,并会在大量访问时降低服务器消耗。
看来静态化是个更治本的办法,接下来可以简单考虑一下静态化的方案,等到网站统计显示出需要时再具体实施。
非模版静态化:只要用XMLHTTP读取动态的源文件就行。虽然生成较慢,消耗资源也多,但使用方便,对于生成效率只要设法控制好文件生成频律等也没什么问题。是个不错的“凑合”办法,如果需要当作首选。
模版静态化:需要写一个模版和相应的东西,麻烦些。效率虽比无模版高些,但也高不了多少。只是在生成文件过程中可以引入更多的功能,还是很诱人的。如果今后真的有时间精力放松一下,不妨当成一个为技术而技术的活来做。
生成文件编码:这是个很棘手的问题,分为读入和输出两方面,都要借助adodb.stream来实现编码转换,以防止乱码。而FSO似乎也不能写出UTF-8编码的文件。所以我也改为采用adodb.stream来生成文件。非模版方式的核心代码我已调试完成,不会出现乱码了,我会附在文尾。模版方式肯定也要相关设置的,等真的用到的时候再调罢。
生成频率问题:最简单的是由我不定时的手动生成。至于定时生成恐怕很难完成,因为没有触发。复杂一点可以设置一种计数器和算法,由访问者触发更新。
设想的其它细节:1. 连接远程XML成功率的问题——如果出错重试三次?(幸好前阵完善了报错和确认无错的部分,只要再加入一个循环就能实现)。2. 对于生成文件时无法成功更新的Feeds——初步设想有两种:用户阅读时交还给动态解析程序凑合(容易实现);保持上一次(只有用模版方式才好实现)。3. 其它细节均是特定方案中遇到的特定情况,这里不赘述了。
最后附上无模版生成HTML静态文件的核心代码(要求主机有MSXML2和adodb.stream支持)
<%@ CODEPAGE=65001 %>
<% Response.Charset="UTF-8" %>
<% '常用函数 '1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码 function getHTTPPage(url) dim Http set Http=server.createobject("MSXML2.XMLHTTP") Http.open "GET",url,false Http.send() if Http.readystate<>4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,"UTF-8")
set http=nothing
if err.number<>0 then err.Clear
end function
'2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
txtURL="http://localhost/index.asp" '想要读取的文件地址
sText = getHTTPPage(txtURL)
filename="test.htm" '想要生成的文件名
Set objStream = Server.CreateObject("ADODB.Stream")
With objStream
.Open
.Charset = "utf-8" '编码,这里你可以改成任何编码
.Position = objStream.Size
.WriteText = sText '模版+数据
.SaveToFile server.mappath(filename),2 '生成文件路径
.Close
End With
Set objStream = Nothing
Response.Write "文件创建成功"
%>
没有评论:
发表评论