Main

它它它它 Archives

浅谈网站如何发挥和利用引导功能

我认为网站的推广和营销是一个从内到外的过程!这个过程是不能马虎半点的!需要你用心去做好每一件事情的,只要有一个地方出了问题,那么你的网站也许回给人很不好的影响,要使自己的网站朝着品牌和树立起企业形象的话,必须从最基础的东西做起,做好,而一个网站要给网民很深刻的品牌影响的话,必须在首页。在论坛,以及网站可以见到的地方,给予会员一种引导,此刻网站的引导就显得格外的重要,因为对于第一次或者已经多次浏览网站的网民来说,他们对于一个网站的意识里,只是模糊的,需要网站的主动引导和吸引,就像市场里拉动销售,因为网站不能等着会员的自己自动去浏览和产生兴趣,因为网民对网站的兴趣很大一部分就是靠引导!别人说兴趣是最好的老师!那么好的引导就是产生兴趣的基础

  也许有的人回问,什么叫网站的引导呢?谁的网站在做这样的事情呢?其实中国所有的网站都是在做这个事情,可能有的网站意识到了这点,做的比较好,有的没有意识到,做的比较差,因为每个网站都是想推广出去,想吸引到会员,那么他就不得不采取一些措施和宣传方法技巧等,而这些宣传技巧,很可能就是引导的一种!

  也许有很多回问,自己在浏览网站的时候,却没有明显的感觉到网站的引导啊?其实很多会员在浏览网站的时候,是已经有意识和无意识的被网站引导着?有的比较强烈,有的却没有那么强烈?

  不管是小网站,还是大网站,都是在使用各种各样的引导,用来吸引会员,吸引网民的眼球,留驻会员的心,增加会员对网站的忠诚读和粘贴度等

  既然网站的引导是那么重要的话,那么到底网站一般回使用些什么引导呢?引导的方式有那些呢?什么时候需要使用网站引导呢?又是在网站的什么地方使用网站的引导呢?

  引导具体有以下几种方式:

  1。图片引导:

  图片引导,不单单是一个广告图片和广告LOGO的形式,图片引导有网站自身的宣传形象图片或者广告图片,或者是具体某次活动的宣传图片,例如: www.1pai.com.cn 一拍网,他的首页和各个频道就有很多图片引导。从头到尾都是图片引导的,一个是推广活动里大图片的引导,一个搜索功能大图标的推广,一个是免费注册等都是图片引导的功能。同时他的一拍诚信卖家专区等都是比较醒目的图片引导,这里有大图片的引导,也有小图片的引导,有静态的图片引导,也有动态的图片引导。在图片上等有文字与图片相结合等的引导,无论这些图片怎么样,都是网站里经常使用的引导方式!一拍网在图片引导方面做的比较好!而中国特许经营咨询网: http://www.fran.com.cn/ 图片引导做的却比较差。我们在浏览这个网站的时候,可以说感觉不到他的图片引导,也就是我们所说的图片引导不强烈,没有吸引力等,同时他做的比较死板,动态和静态等方面做的比较单调,这个和技术人员以及美工的水平有关系的!

  不过在这里我必须强调的一点就是:一个网站的图片引导不是越多越好,而是恰到的好处,才能起到最佳的引导作用,我们再浏览一些网站时,回反感,为什么呢?因为他们有很多的图片,给我们的感觉乱的很,看不过来,眼花缭乱的,没有主题,没有方向,根本就没有起到好的引导作用,而是反感的作用,所以图片引导要想做的好的话,需要根据网站的首页大小,以及文字内容的布局以及栏目版块的架构等来决定的,同时还要结合自己网站的会员特点和图片引导的主题和目的等进行来规划的,给人真正起到引导作用,不能适得起反!所以我们不能小看网站的引导!光图片引导就有很多的学问和讲究的!要想做好一个优秀的网站的话,不是那么简单的事情!

  2。文字引导:

  文字引导可能没有图片引导那么直观的,但是文字引导的诱惑性还是很强大的?

  我们再来看看一拍网的文字引导是如何做的:www.1pai.com.cn !我们仔细看一拍的首页就回发现,他在文字引导方面做的也是相当出色的,比如在他的搜索下面有一行小文字引导:免费送货!10倍长焦富士S5500优惠套餐这个即使广告的引导,又算是文字引导。同时他的每个栏目的设置是文字引导:比如:我要买,我要卖,我的一拍。一拍论坛等都是属于文字引导,只是是栏目内容上的文字引导,有一些文字引导是单出的活动吸引,有一些是结合栏目内容架构出现的文字引导。他的免费注册就出现了两个地方,文字的颜色和动态等都是不一样的,给人以错觉的吸引,从视觉上说,是起到好的引导,同时起到了简单的主题引导,文字引导也有很多的变化,比如文字的大小和文字的颜色,以及文字是否动还是不动,同时文字的意思是否简单,文字是否很有吸引力或者文字的吸引主题是否明确等。同时文字还可以结合图片的引导进行引导,同时还可以结合网站的功能结合引导等?文字引导有说明性的引导,有介绍性的引导,有议论式的引导,有强烈性的引导,有给人感官和视觉等各个方面的引导,要完全做好一个网站首页的文字引导的话,也是一个很大的工作量。文字引导是在网站里出现最多的引导,网站的首页和各个字页面都是有文字引导的,只要是文字就可以算是文字引导。文字引导要做好的话,需要结合图片引导和网站其他的内容架构和网站的版面设计等,不能单独的看待文字引导!比如说中国特许经营咨询网:http: //www.fran.com.cn/ 的文字引导就没有很好的处理,给人是满篇的文字,看起来文字太多,可能一开始给人以心理的惧怕,因为现在的网络,没有什么人愿意看很多的文字了?而他的文字也处理的不好,没有很好的于网站的内容架构和图片等结合起来

  3。功能引导:

  功能引导就是网站的功能,比如注册的时候,他的功能流程,在使用的时候,他的功能一些限制,功能的扩大,功能的引导也是很重要的一部分,很多网民就是不怎么回使用网站的功能,而放弃这个网站,或者说这个网站的功能操作比较复杂的话,他也回放弃使用,文字和图片引导更多的是视觉和感官上的引导和吸引,但是真正给会员带来最大帮助的却是网站的功能,功能的引导必须结合网站的设计思想,必须结合网站的特点和主题,必须结合网站的会员实际特点等,比如这个网站的页面是简洁化的风格的话,那么他的功能就不要太复杂了,假如这个网站的会员大多是文化程度不高的人,那么网站的功能必须简单化和傻瓜化,假如这个网站的目标顾客是比较熟悉电脑和网络的人,那么你的功能可以比较复杂点,同时网站的功能必须结合网站的内容等进行规划的,功能引导有功能使用和操作流程,也有注册和交流等各种引导

  4。活动和话题引导:

  网站还有活动的引导,因为一个网站为了达到宣传和吸引会员的目的,那么他不得不采取一些宣传和吸引活动,也就是活动引导或者话题引导,活动引导可以在首页出现,也可以在论坛等各个地方出现,活动引导也结合着文字和图片等引导,有的时候还可能牵涉到功能,所以活动引导是比较复杂的引导,也是相对重要的引导,因为活动不是每天有的,而是有规律,有计划的出现,针对性比较强,和网站其他内容栏目结合的比较紧密,所以活动引导也是值得我们研究的对象。活动引导大多是以网站自身的发布对象来出现的:比如网站的公告,或者是第三者出现的引导,比如某个网站的市场调查!或者是某些会员自己组织的活动引导和话题引导:这个比较多的出现在论坛里?比如最近来这个网站的会员有什么感受等,不管这些活动和话题引导怎么样,对网站的品牌和形象,以及吸引会员方面都是起到很重要的作用,我们不能忽视,同时面对会员自发组织的话题引导,网站要有一套完善的管理制度,不然很难管理,回出现很乱的局面,对于自己的活动引导,必须有规划有计划的进行,不能随便乱来,同时需要结合自己网站的特点和会员的特点进行,不能想当然的随便推出活动引导,要根据活动引导的目的和要求,以及对象,效果和影响等来操作,尽最大的努力去做好每次的活动引导

  5。言论引导:

  每个网站几乎都是有论坛的,那么在论坛里,就有言论了,对于论坛,言论引导也是相当重要的一个,他是直接关系到会员与网站之间,以及网站对外形象的利益,而不能简单的处理,需要把握好会员的言论对网站的作用,控制好论坛言论对网站的影响,同时网站需要组织好会员的言论引导,比如很多论坛里有会员回搞个什么话题探讨,或者搞个什么活动的,或者搞个什么制度等,这些都是言论引导的形式,不管怎么样,网站需要控制好他们对网站的影响,以及会员的反映,不要等出现了的问题再去解决,需要在论坛建设之前有个好的规划和会员管理制度以及论坛和网站管理等制度

  在这里我大致的列举了一些网站常用的引导方式,其实还有很多的引导方式,需要我们挖掘和利用,使这些东西对我们有帮助等!

  好好发挥引导的作用,使网站对外的形象和品牌,以及会员对网站的忠诚度等达到一个完美的状态

October 29, 2005

1000了.纪念一下.

呵呵,图图:
uploads/200510/29_125142_d150764f120a4c808a3d9c65413e89bb0.jpg

October 28, 2005

数据库作业要求

通知
数据库作业要求
设计开发一个小型的数据库管理系统即图书管理系统,参考语言:VB,VF,Delphi,PB,VC,SQL_Server等
一、设计目的
学生更具所学的数据库原理与程序设计的指示,能够针对一个小型的数据库管理系统,进行系统的需求分析,系统设计,数据库设计,编码等,完成题目要求的功能,从而达到掌握开发一个小型数据库的目的。二、设计内容
1、要的数据表 图书基本信息表,借书卡信息表,借阅信息表,图书分类信息表,代码表等。
2、功能模块
1)图书基本情况的录入、修改、删除等基本操作。
2)办理借书卡模块
3)实现借书功能
4)实现还书功能
5)能方便的对图书进行查询
6)对超期的情况能自动给出提示信息。
7)具有数据备份和数据恢复功能(可选)
实验三人一组,实验结束后交实验报告

Click Here To Download

微软建议的ASP性能优化28条守则

目录
技巧 1:将经常使用的数据缓存在 Web 服务器上
技巧 2:将经常使用的数据缓存在 Application 或 Session 对象中
技巧 3:将数据和 HTML 缓存在 Web 服务器的磁盘上
技巧 4:避免将非敏捷的组件缓存在 Application 或 Session 对象中
技巧 5:不要将数据库连接缓存在 Application 或 Session 对象中
技巧 6:合理地使用 Session 对象
技巧 7:将代码封装在 COM 对象中
技巧 8:迟一点获得资源,早一点释放资源
技巧 9:进程外执行过程以性能换取可靠性
技巧 10:使用显式选项
技巧 11:在子例程和函数中使用局部变量
技巧 12:将经常使用的数据复制到脚本变量中
技巧 13:避免重新确定数组的维数
技巧 14:使用响应缓冲
技巧 15:批处理内嵌脚本和 Response.Write 语句
技巧 16:如果页面需要很长时间才能完成,那么执行前使用 Response.IsClientConnected
技巧 17:使用 <OBJECT> 标记例示对象
技巧 18:对于 ADO 和其它组件使用 TypeLib 绑定
技巧 19:利用浏览器的验证功能
技巧 20:避免在循环语句中使用字符串串联
技巧 21:启用浏览器和代理缓存
技巧 22:尽可能使用 Server.Transfer 代替 Response.Redirect
技巧 23:在目录 URL 中使用后斜杠
技巧 24:避免使用服务器变量
技巧 25:升级到最新和最出色的
技巧 26:优化 Web 服务器
技巧 27:进行性能测试
技巧 28:阅读资源链接
引言
性能是一个特征。您必须预先设计性能,否则您以后就得重写应用程序。就是说,有哪些好的策略可使 Active Server Pages (ASP) 应用程序性能达到最佳?

本文介绍了优化 ASP 应用程序和 Visual Basic&reg; Scripting Edition (VBScript) 的技巧。本文讨论了许多陷阱。本文列出的建议已经在 http://www.microsoft.com 和其它站点中进行了测试,效果十分显著。本文假定您已经对 ASP 开发,包括 VBScript 和/或 JScript、ASP Application、ASP Session 和其它 ASP 固有对象(Request、Response 和 Server)有了基本了解。

通常,ASP 性能主要取决于 ASP 代码本身以外的很多因素。我们不在一篇文章中罗列出所有的信息,在本文结尾处我们列出了与性能有关的资源。这些链接涵盖了 ASP 和非 ASP 主题,包括 ActiveX&reg; 数据对象 (ADO)、组件对象模型 (COM)、数据库和 Internet Information Server (IIS) 配置。这些都是我们喜欢的一些链接 - 一定要去看看。

技巧 1:将经常使用的数据缓存在 Web 服务器上
典型的 ASP 页从后端数据存储中检索数据,然后将结果转换成超文本标记语言 (HTML)。无论数据库的速度如何,从内存中检索数据总要比从后端数据存储中检索数据快得多。从本地硬盘读取数据通常也比从数据库中检索数据更快。因此,通常可以将数据缓存在 Web 服务器上(存储在内存或磁盘中),来提高性能。

缓存是传统的以空间换取时间的做法。如果您缓存的内容正确,那么您可以看到性能会有显著的提高。为使缓存有效,必须保存那些经常重复使用的数据,且要重新计算这些数据需要(适度)大的开销。如果缓存的都是些陈旧的数据,就会造成内存浪费。

不经常发生改变的数据是很好的缓存候选数据,因为您不必担心随着时间的迁移该数据与数据库同步的问题。组合框列表、引用表、DHTML 碎片、扩展标记语言 (XML) 字符串、菜单项和站点配置变量(包括数据源名称 (DSN)、Internet 协议 (IP) 地址和 Web 路径)都是很好的缓存候选内容。注意您可以缓存数据的“表示”,而不缓存数据本身。如果 ASP 页很少更改,且缓存的开销也很大(例如,整个产品目录),则应考虑事先产生 HTML,而不是在响应每个请求时重新显示。

应将数据缓存在哪里,有哪些缓存策略?通常,数据缓存在 Web 服务器的内存或磁盘中。下两个技巧讲述了这两个方法。

技巧 2: 将经常使用的数据缓存在 Application 或 Session 对象中
ASP Application 和 Session 对象为将数据缓存在内存中提供了方便的容器。您可以将数据指派到 Application 和 Session 对象中,这些数据在 HTTP 调用之间保留在内存中。Session 数据是按每个用户分别存储的,而 Application 数据则在所有用户之间共享。

什么时候将数据装载到 Application 或 Session 中呢?通常,数据是在启动 Application 或 Session 时装载。要在 Application 或 Session 启动过程中装载数据,应将适当的代码分别添加到 Application_OnStart() 或 Session_OnStart() 中。这些函数应在 Global.asa 中,如果没有,则可以添加这些函数。还可以在第一次需要时装载该数据。为此,在 ASP 页中添加一些代码(或编写一个可重复使用的脚本函数),以检查数据是否存在,如果不存在,就装载数据。这是一个传统的性能技术,称为“惰性计算” - 在您知道需要某一个值以前不计算该值。例如:

<%
Function GetEmploymentStatusList
Dim d
d = Application(?EmploymentStatusList?)
If d = ?? Then
' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()
Application(?EmploymentStatusList?) = d
End If
GetEmploymentStatusList = d
End Function
%>

可以为所需要的每个数据块编写类似的函数。

应以什么格式存储数据?可以存储任何变体类型,因为所有脚本变量都是变体型。例如,您可以存储字符串、整数或数组。通常,您将以这些变量类型之一存储 ADO 记录集的内容。要从 ADO 记录集获取数据,您可以手工将数据复制到 VBScript 变量,一次一个字段。使用一个 ADO 记录集持久函数 GetRows()、GetString() 或 Save()(ADO 2.5),可加快速度且更容易一些。其详细情况已超出本文所讨论的范围,但下面给出了一个函数举例,说明使用 GetRows() 返回记录集数据的一个数组:

' Get Recordset, return as an Array
Function FetchEmploymentStatusList
Dim rs
Set rs = CreateObject(?ADODB.Recordset?)
rs.Open ?select StatusName, StatusID from EmployeeStatus?, _
?dsn=employees;uid=sa;pwd=;?
FetchEmploymentStatusList = rs.GetRows() ? Return data as an Array
rs.Close
Set rs = Nothing
End Function

对上面举例做更进一步改进,可以将 HTML 缓存为列表,而不是数组。下面是简单的示例:

' Get Recordset, return as HTML Option list
Function FetchEmploymentStatusList
Dim rs, fldName, s
Set rs = CreateObject(?ADODB.Recordset?)
rs.Open ?select StatusName, StatusID from EmployeeStatus?, _
?dsn=employees;uid=sa;pwd=;?
s = ?<select name=??EmploymentStatus??>? & vbCrLf
Set fldName = rs.Fields(?StatusName?) ' ADO Field Binding
Do Until rs.EOF
' Next line violates Don't Do String Concats,
' but it's OK because we are building a cache
s = s & ? <option>? & fldName & ?</option>? & vbCrLf
rs.MoveNext
Loop
s = s & ?</select>? & vbCrLf
rs.Close
Set rs = Nothing ' See Release Early
FetchEmploymentStatusList = s ' Return data as a String
End Function

在适当的条件下,可以将 ADO 记录集本身缓存在 Application 或 Session 作用域中。有两个警告:

必须将 ADO 标记为自由线程
必须使用断开连接的记录集。
如果不能保证满足这两个要求,则不要缓存 ADO 记录集。在下面的“非敏捷组件”和“不要缓存连接”技巧中,我们将讨论将 COM 对象存储在 Application 或 Session 作用域中的危险性。

当您将数据存储在 Application 或 Session 作用域时,数据将保留在那里,直到您以编程方式改变它、Session 过期或 Web 应用程序重新启动为止。如果数据需要更新怎么办?要手工强制对 Application 数据进行更新,您可以访问只有管理员才可访问的 ASP 页来更新数据。或者,您可以通过函数定期自动刷新数据。下面例子存储带有缓存数据的时间戳,并隔一段时间后刷新数据。

<%
' error handing not shown...
Const UPDATE_INTERVAL = 300 ' Refresh interval, in seconds

' Function to return the employment status list
Function GetEmploymentStatusList
UpdateEmploymentStatus
GetEmploymentStatusList = Application(?EmploymentStatusList?)
End Function

' Periodically update the cached data
Sub UpdateEmploymentStatusList
Dim d, strLastUpdate
strLastUpdate = Application(?LastUpdate?)
If (strLastUpdate = ??) Or _
(UPDATE_INTERVAL < DateDiff(?s?, strLastUpdate, Now)) Then

' Note: two or more calls might get in here. This is okay and will simply
' result in a few unnecessary fetches (there is a workaround for this)

' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()

' Update the Application object. Use Application.Lock()
' to ensure consistent data
Application.Lock
Application(?EmploymentStatusList?) = Events
Application(?LastUpdate?) = CStr(Now)
Application.Unlock
End If
End Sub

请参见 World's Fastest ListBox with Application Data,上面还有一个例子。

要知道在 Session 或 Application 对象中缓存大的数组不是一个好的做法。在访问数组的任何元素之前,脚本语言的语法要求必须临时复制整个数组。例如,如果将由字符串组成的有 100,000 个元素的数组(该数组将美国邮政编码映射到当地的气象站)缓存在 Application 对象中,ASP 必须先将所有的 100,000 个气象站复制到临时数组中,然后才能提取一个字符串。在这种情况下,用自定义方法建立一个自定义组件来存储气象站 - 或使用一个词典组件会更好。

再警告大家一下,不要将婴儿与洗澡水一起倒掉:数组能快速查寻和存储在内存中是邻近的关键数据对。索引一个词典比索引一个数组要慢得多。应针对您的实际情况,选择提供最佳性能的数据结构。

技巧 3:将数据和 HTML 缓存在 Web 服务器的磁盘上
有时,数据可能太多,无法都缓存在内存中。“太多”只是一个说法,这要看您想消耗多少内存,以及需缓存的项目数和检索这些项目的频率。在任何情况下,如果数据太多而无法都缓存在内存中,则考虑将数据以文本或 XML 文件缓存在 Web 服务器的硬盘上。可以同时将数据缓存在磁盘和内存中,为您的站点建立最适宜的缓存策略。

注意当测量单个 ASP 页的性能时,检索磁盘上的数据可能不一定要比从数据库检索数据更快。但缓存会降低数据库和网络上的负载。在高负载的情况下,这样做可大大改善总体吞吐量。当缓存开销很大的查询结果(如多表联接或复合存储过程)或大的结果集时,这是非常有效的。与往常一样,要测试一下几种方案的优劣。

ASP 和 COM 提供一些建立基于磁盘的缓存方案的工具。ADO 记录集 Save() 和 Open() 函数保存和装载磁盘中的记录集。可以使用这些方法重新编写上面 Application 数据缓存技巧中的代码示例,用文件的 Save() 代替写到 Application 对象中的代码。

有一些其它组件可以用于文件:

Scripting.FileSystemObject 可使您创建、读和写文件。
与 Internet Explorer 一起提供的 Microsoft&reg; XML 解析器 (MSXML) 支持保存和装载 XML 文档。
LookupTable 对象(例如,用在 MSN 上)是从磁盘装载简单列表的最好选择。
最后,应考虑将数据的表示缓存在磁盘上,而不是数据本身。预先转换的 HTML 可以用 .htm 或 .asp 文件存储在磁盘上,超级链接可以直接指向这些文件。可以使用商用工具,如 XBuilder,或 Microsoft&reg; SQL Server&#8482; Internet 发布功能将产生 HTML 的过程自动化。或者,您可以将 HTML 代码片断放在 .asp 文件中。还可以使用 FileSystemObject 从磁盘读取 HTML 文件,或使用 XML 尽早转换。

技巧 4:避免将非敏捷的组件缓存在 Application 或 Session 对象中
尽管将数据缓存在 Application 或 Session 对象中是一个好的做法,但缓存 COM 对象却有严重的陷阱。通常,人们倾向于将经常使用的 COM 对象缓存到 Application 或 Session 对象中。很遗憾,许多 COM 对象(包括所有以 Visual Basic 6.0 或更低版本编写的对象)当存储在 Application 或 Session 对象时,会引起严重的瓶颈。

具体来讲,当任何不敏捷的组件缓存在 Session 或 Application 对象时,将引起性能瓶颈。敏捷的组件是被标记为 ThreadingModel=Both 的组件,它聚集 Free-threaded marshaler (FTM);或被标记为 ThreadingModel=Neutral 的组件。(Neutral 模型是 Windows&reg; 2000 和 COM+ 的新增模型。) 下列组件不是敏捷的:

自由线程的组件(除非它们聚集 FTM)。
单元线程组件。
单线程组件。
配置的组件(Microsoft Transaction Server (MTS)/COM+ 库和服务器程序包/应用程序)不是敏捷的,除非它们是 Neutral 线程。单元线程组件和其它非敏捷的组件在页作用域内是最适合的(即,它们在单个 ASP 页上创建和销毁)。

在 IIS 4.0 中,被标记为 ThreadingModel=Both 的组件被认为是敏捷的。在 IIS 5.0 中,只有这一点还不够。组件必须不仅被标记 Both,还必须聚集 FTM。有关敏捷性的文章讲述了如何使以 Active Template Library 编写的 C++ 组件聚集 FTM。要注意如果组件缓存界面指针,那么那些指针本身必须是敏捷的,或必须存储在 COM 共用界面表 (GIT) 中。如果您不能重新编译 Both 线程组件以聚集 FTM,那么您可以将组件标记为 ThreadingModel=Neutral。或者,如果您不想让 IIS 执行敏捷性检查(因此,您可以允许非敏捷的组件存储在 Application 或 Session 作用域中),您可以在配置数据库中将 AspTrackThreadingModel 设置为 True。不建议更改 AspTrackThreadingModel。

如果您想将以 Server.CreateObject 创建的非敏捷的组件存储在 Application 对象中,IIS 5.0 将出现一个错误。您可以在 Global.asa 中使用 <object runat=server scope=application ...> 避免这一错误,但不建议这样做,因为这会导致汇集和串行化,关于这一点将在下面讲述。

如果您缓存非敏捷的组件会出现什么毛病?缓存在 Session 对象中的非敏捷的组件将 Session 锁定于 ASP 工作者线程。ASP 维护一个工作者线程池来处理请求。通常情况下,一个新请求总是由第一个可用的工作者线程来处理。如果 Session 被锁定于一个线程,那么请求必须等到其相关的线程可用为止。这里有一个类比,也许会有所帮助:您去一家超级市场,挑选了一些商品,并在 #_3 收款台付款。其后,每当您在那家超级市场为商品付款时,您总是必须在 #_3 收款台付款,即使其它收款台前排队的人较少或者没有人排队,也是如此。

将非敏捷的组件存储在 Application 作用域对性能的影响甚至更坏。ASP 必须创建一个特殊的线程运行存储在 Application 作用域中的非敏捷组件。这会有两个结果:所有调用都必须汇集到此线程,且所有调用都排成长队。“汇集”的意思是参数必须存储在内存的共享区域;执行一个开销很大的到特殊线程的上下文切换;执行组件的方法;将结果汇集到共享区域;执行另一个开销很大的上下文切换,将控制返回到原始的线程。“串行化”意思是指每次只运行一个方法。两个不同的 ASP 工作者线程不能同时在共享组件上执行多个方法。这样就杜绝了并发性,特别是在多处理器计算机上。更糟的是,所有非敏捷的 Application 作用域的组件共享一个线程(主机 STA),因此串行化的影响甚至更显著。

如之奈何?下面是一些一般的规则。如果您使用 Visual Basic (6.0) 或更早版本编写对象,那么不要将它们缓存在 Application 或 Session 对象中。如果您不知道对象的线程模型,不要缓存它。不要缓存非敏捷的对象,而应在每个页面创建和释放它们。对象直接在 ASP 工作者线程上运行,因此没有汇集或串行化。如果 COM 对象在 IIS 服务器上运行,且如果它们不花长时间初始化和删除,性能尚可。注意单线程对象不应该这样使用。小心 - VB 可创建单线程对象!如果您必须这样使用单线程对象(如 Microsoft Excel 电子表格),别指望会有很高的吞吐量。

当 ADO 被标记为自由线程,ADO 记录集可以安全地缓存。要将 ADO 标记为自由线程,使用 Makfre15.bat 文件,该文件通常位于目录 \\Program Files\Common\System\ADO 中。

警告 如果您使用 Microsoft Access 作为数据库,不应将 ADO 标记为自由线程的。ADO 记录集也必须切断连接。一般来说,如果您不能控制站点中的 ADO 配置(例如,您是一个独立的软件厂商 [ISV],向管理他们自己的配置客户销售 Web 应用程序),最好不要缓存记录集。

词典组件也是敏捷的对象。LookupTable 从数据文件中装载其数据,可用于组合框数据和配置信息。Duwamish Books 中的 PageCache 对象可提供词典语法,Caprock Dictionary 也可提供。这些对象或其派生对象可以构成有效缓存策略的基础。注意 Scripting.Dictionary 对象不是敏捷的,不应该存储在 Application 或 Session 作用域中。

技巧 5:不要将数据库连接缓存在 Application 或 Session 对象中
缓存 ADO 连接通常是很糟糕的策略。如果一个 Connection 对象存储在 Application 对象中,并在所有的页面中使用,那么所有页面将争抢这一连接。如果 Connection 对象存储在 ASP Session 对象中,那么将为每个用户创建数据库连接。这就会使连接池的优势荡然无存,并给 Web 服务器和数据库带来不必要的压力。

可以不缓存数据库连接,而是在使用 ADO 的每个 ASP 页面中创建和删除 ADO 对象。这是很有效的,因为 IIS 内嵌了数据库连接池。更准确地说,IIS 自动启用 OLEDB 和 ODBC 连接池。这就能确保在每个页面上创建和删除连接将是有效的。

因为连接的记录集存储一个到数据库连接的引用,所以您不应将连接的记录集缓存在 Application 或 Session 对象中。但是,您可以安全地缓存断开连接的记录集,它们不保存到其数据连接的引用。要断开记录集连接,执行下面的两个步骤:

Set rs = Server.CreateObject(?ADODB.RecordSet?)
rs.CursorLocation = adUseClient ' step 1

' Populate the recordset with data
rs.Open strQuery, strProv

' Now disconnect the recordset from the data provider and data source
rs.ActiveConnection = Nothing ' step 2

有关连接池的更详细信息,可以在 ADO 和 SQL Server 参考资料中找到。

技巧 6:合理地使用 Session 对象
既然我们已经讨论了缓存在 Application 和 Session 中的优点,现在开始讨论避免使用 Session 对象的问题。正如下面所讨论的,当与忙的站点一起使用时,Session 有几个缺点。“忙”的意思一般是指一秒钟要求几百页面或成千上万同时用户的站点。这个技巧对于必须水平扩展的站点 - 即,那些利用多台服务器以处理负载或实现容错的站点 - 甚至更重要。对于较小的站点,诸如 Intranet 站点,要想实现 Session 带来的方,必然增大系统开销。

简言之,ASP 自动为每个访问 Web 服务器的用户创建一个 Session。每个 Session 大约需要 10 KB 的内存开销(最主要的是数据存储在 Session 中),这就使所有的请求都减慢。在配置的超时时段(通常是 20 分钟)结束以前,Session 一直保留有效。

Session 的最大的问题不是性能,而是可扩展性。Session 不能跨越几台 Web 服务器,一旦在一台服务器上创建 Session,其数据就留在那儿。这就意味着如果您在一个 Web 服务器群使用 Session,您必须设计一个策略,将每个用户请求始终发到用户 Session 所在的那台服务器上。这被称为将用户“粘”在 Web 服务器上。术语“粘性会话”就是从这里派生而来的。如果 Web 服务器崩溃,被“粘住的”用户将丢失他们的会话状态,因为会话不是粘到磁盘上。

实现粘性会话的策略包括硬件和软件解决方案。诸如 Windows 2000 Advanced Server 中的网络负载平衡和 Cisco 的 Local Director 之类的解决方案都可以实现粘性会话,代价是要损失一定程度的可扩展性。这些解决方案是不完善的。不建议此时部署您自己的软件解决方案(我们过去常常使用 ISAPI 筛选器和 URL 转换等等)。

Application 对象也不跨越多台服务器,如果您必须跨越 Web 服务器群共享和更新 Application 数据,您必须使用后端数据库。但是,只读 Application 数据在 Web 服务器群中仍是有用的。

如果只是因为要增加运行时间(处理故障转移和服务器维护),大多数关键任务站点至少需部署两台 Web 服务器。因此,在设计关键任务应用程序时,必须实现“粘性会话”,或干脆避免使用 Session,以及任何其它将用户状态存储在单个 Web 服务器上的状态管理技术。

如果您不使用 Session,一定要将它们关闭。您可以通过 Internet Services Manager,为应用程序执行此操作(参见 ISM 文档)。如果您决定使用 Session,您可以采用一些方法减轻它们对性能的影响。

您可以将不需要 Session 的内容(如帮助屏幕,访问者区域等等)移到另一个关闭了 Session 的 ASP 应用程序中。您可以逐页提示 ASP,您不再需要该页面上的 Session 对象,使用以下放在 ASP 页面最上面的指令:

<% @EnableSessionState=False %>

使用这一指令有一个很好的理由是,这些 Session 在框架集方面存在一个有意思的问题。ASP 保证任何时候 Session 只有一个请求执行。这样就确保如果浏览器为一个用户请求多个页面,一次只有一个 ASP 请求接触 Session,这样就避免了当访问 Session 对象时发生的多线程问题。很遗憾,一个框架集中的所有页面将以串行方式显示,一个接一个,而不是同时显示。用户可能必须等候很长时间,才能看到所有的框架。该故事的寓意:如果某些框架集页面不依靠 Session,一定要使用 @EnableSessionState=False 指令告诉 ASP。

有许多管理 Session 状态的方法,可替代 Session 对象的使用。对于少量的状态(少于 4 KB),我们通常建议使用 Cookies、QueryString 变量和隐式变量。对于更大数据量,如购物小车,后端数据库是最适合的选择。有关 Web 服务器群中状态管理技术的文章很多。有关详细信息,请参见 Session 状态参考资料。

技巧 7: 将代码封装在 COM 对象中
如果您有许多 VBScript 或 JScript,您可以经常将代码移到编译的 COM 对象中,从而可改善性能。编译的代码通常比解释的代码运行得更快。编译的 COM 对象可以通过“早绑定”访问其它 COM 对象,与脚本使用的“晚绑定”相比,“早绑定”是调用 COM 对象的更有效方法。

将代码封装在 COM 对象中还有一些优点(除性能之外):

COM 对象有利于将表示逻辑与业务逻辑分开。
COM 对象可以保证代码重复使用。
许多开发人员发现以 VB、C++ 或 Visual J++ 编写的代码比 ASP 更容易调试。
COM 对象也有缺点,包括初始开发时间和需要不同的程序设计技巧。注意封装少量的 ASP 可能引起性能下降,而不会得到性能改进。这种情况通常在少量的 ASP 代码被封装进 COM 对象时发生。在这种情况下,创建和调用 COM 对象的系统开销超过了编译的代码的优点。应反复地试验,以确定什么样的 ASP 脚本和 COM 对象代码的组合产生最好的性能。注意,与 Microsoft Windows NT&reg; 4.0/IIS 4.0 相比,Windows 2000/IIS 5.0 中在脚本和 ADO 性能方面有了很大的改进。因此,随着 IIS 5.0 的推出,编译代码比 ASP 代码的性能优势有所降低。

有关在 ASP 中使用 COM 的优点和缺点的详细讨论,参见 ASP Component Guidelines and Programming Distributed Applications with and Microsoft Visual Basic 6.0。如果您部署 COM 组件,以负荷对它们进行测试特别重要。事实上,理所当然应对所有的 ASP 应用程序进行负荷测试。

技巧 8:迟一点获得资源,早一点释放资源
这里是一个小技巧供您参考。一般来说,最好迟一点获得资源,早一点释放资源。这适用于 COM 对象以及文件句柄和其它资源。

这种优化方法主要用于 ADO 连接和记录集。当您使用完记录集,比方说在显示一个表及其数据之后,应立即释放它,而不是等到页面结束时再释放。将 VBScript 变量设置为 Nothing 是最好的做法。不要让记录集超出作用域之外。而且,要释放任何相关的 Command 或 Connection 对象(在将记录集或连接设置为 = Nothing 之前,不要忘记调用 Close())。这会缩短数据库必须为您准备资源的时间,并尽快释放数据库到连接池的连接。

技巧 9:进程外执行过程以性能换取可靠性
ASP 和 MTS/COM+ 两者都有配置选项,可使您兼顾可靠性和性能。当建立和部署应用程序时,应知道如何兼顾两者的性能。

ASP 选项
可以配置 ASP 应用程序,以便以三种方法之一运行。在 IIS 5.0 中,引入了“隔离级”这一术语以说明这些选项。这三个隔离级分别是低级、中级和高级:

低级隔离。这在 IIS 的所有版本中都得到支持,且是最快的。它在 Inetinfo.exe 中运行 ASP,Inetinfo.exe 是主要 IIS 进程。如果 ASP 应用程序崩溃,IIS 也会崩溃。(要在 IIS 4.0 下重新启动 IIS,Web 站点管理员应使用诸如 InetMon 之类的工具监视站点,如果服务器发生故障,应启用批处理文件以重新启动服务器。IIS 5.0 引入了可靠的重新启动,该方法可使发生故障的服务器自动重新启动。)
中级隔离。IIS 5.0 引入了这个新的级别,它被称为进程外级别,因为 ASP 在 IIS 进程之外运行。在中级隔离中,被配置作为中级隔离运行的所有 ASP 应用程序都共享一个进程空间。这就减少了在一台服务器运行多个进程外 ASP 应用程序所需要的进程数量。中级隔离是 IIS 5.0 中的默认隔离级别。
高级隔离。在 IIS 4.0 和 IIS 5.0 中支持这一级别,高级隔离也是进程外的。如果 ASP 崩溃,Web 服务器并不会崩溃。下次 ASP 请求时,ASP 应用程序就会自动重新启动。在高级隔离中,配置作为高级隔离运行的每个 ASP 应用程序都在其自有进程空间中运行。这样做可保护 ASP 应用程序彼此之间不相互干扰。其缺点是它要求每个 ASP 应用程序都要有一个单独的进程。当在一台服务器上必须运行许多应用程序时,系统开销就会大大增加。
哪个选项最好的呢?在 IIS 4.0 中,进程外运行将显著降低性能。在 IIS 5.0 中,做了许多改进,将进程外运行 ASP 应用程序所产生的开销降到最低限度。事实上,在绝大多数测试中,IIS 5.0 中的 ASP 进程外应用程序比 IIS 4.0 中的进程内应用程序运行得更快。不管怎样,在两个平台上,进程内(低隔离级)性能最佳。但是,如果访问率相对较低或最大吞吐量较低,低隔离级的优势不太明显。因此,在您每一 Web 服务器每秒钟需要数百或成千上万页面时,才会觉得有必要设置低隔离级。与往常一样,应对多种配置进行测试,确定您要采取哪一种折衷方案。

注意 当您运行 ASP 进程外应用程序时(中级或高级隔离),它们在 NT4 中的 MTS 和在 Windows 2000 中的 COM+ 中运行。即,在 NT4 中它们在 Mtx.exe 中运行;而在 Windows 2000 中,它们在 DllHost.exe 中运行。您可以在任务管理器中看到这些进程在运行。您还可以看到 IIS 如何为进程外 ASP 应用程序配置 MTS 程序包或 COM+ 应用程序。

COM 选项
COM 组件也有三种配置选项,虽然与 ASP 选项不完全类似。COM 组件可以是“未配置的”、配置为库应用程序或配置为服务器应用程序。“未配置的”意思是指组件没有注册 COM+。组件将在调用程序的进程空间运行,那就是说,它们是“进程内的”。库应用程序也是进程内的,但使用 COM+ 的服务,包括安全、事务和上下文支持。服务器应用程序被配置为在它们自有的进程空间内运行。

您可以看到未配置的组件比库应用程序略有一些优势。库应用程序比服务器应用程序的性能优点更大。这是因为库应用程序与 ASP 在同一进程内运行,而服务器应用程序在它们的自有进程内运行。进程间的调用比进程内调用开销更大。而且,当在进程之间传递诸如记录集之类的数据时,必须在两个进程之间复制所有的数据。

陷阱!当使用 COM 服务器应用程序时,如果您在 ASP 和 COM 之间传递对象,要确保对象执行“按值汇集”或 MBV。执行 MBV 的对象将它们自己从一个进程复制到另一个进程。这比下面一种方法好,采用这种方法时,对象仍在创建者的进程中,另外一个进程反复地调用创建进程以使用该对象。切断连接的 ADO 记录集将“按值汇集”,连接的记录集则不然。Scripting.Dictionary 不执行 MBV,且不在进程之间传递。最后,VB 程序员请注意:MBV 不通过传递参数 ByVal 获得。MBV 由原始的组件作者执行。

怎么办?
如果让我们建议一个兼顾性能与可靠性的合理配置,它们应是如下的配置:

在 IIS 4.0 中,使用 ASP 低隔离级别,使用 MTS 服务器程序包。
在 IIS 5.0 上,使用 ASP 的中隔离级,并使用 COM+ 库应用程序。
这些是非常一般的原则,主机服务公司一般情况下以中或高隔离级运行 ASP,而单用途的 Web 服务器可以以低隔离级运行。衡量各种利弊,并自己决定哪个配置更能符合您的需要。

技巧 10:使用显式选项
在 .asp 文件中应使用 Option Explicit。此指令放在 .asp 文件的最上面,它强制开发人员声明要使用到的所有变量。许多程序员认为这种方法对于调试应用程序很有帮助,因为这种方法避免了键错变量名和误建新变量的可能性(例如,将 MyXMLString=) 错写成 MyXLMString=...。

更重要的一点也许是,声明的变量比未声明的变量速度更快。由此,脚本在运行时每次用到未声明的变量时,按名称引用它。另一方面,声明的变量是有顺序的,要么以编译时间,要么以运行时间。以后,声明的变量都按此顺序引用。因为 Option Explicit 强制变量声明,它能确保声明所有变量,因此访问的速度也很快。

技巧 11:在子例程和函数中使用局部变量
局部变量是那些在子例程和函数内声明的变量。在函数或子例程内,局部变量访问比全局变量访问更快。局部变量的使用也会使代码更清晰,因此应尽量使用局部变量。

技巧 12:将经常使用的数据复制到脚本变量中
当访问 ASP 中的 COM 对象时,应将经常使用的对象数据复制到脚本变量中。这样做可减少 COM 方法调用,因为 COM 方法调用与访问脚本变量相比,开销相对较大。当访问 Collection 和 Dictionary 对象时,这种技术也会减少开销很大的查找。

一般来说,如果您打算不止一次访问对象数据,那么就应将数据放到脚本变量中。这种优化的主要目标是 Request 变量(Form 和 QueryString 变量)。例如,您的站点可传递一个名为 UserID 的 QueryString 变量。假设此 UserID 在特定页面上被引用 12 次。可以无须调用 Request(?UserID?) 12 次,而是在 ASP 页面最上面将 UserID 指派到一个变量。然后在该页面自始至终使用该变量。这样就省去了 11 次 COM 方法调用。

实际上,访问 COM 属性或方法的开销并没有那么大。下面举一个例子,说明某相当常见的代码(从语法上讲):

Foo.bar.blah.baz = Foo.bar.blah.qaz(1)
If Foo.bar.blah.zaq = Foo.bar.blah.abc Then ' ...

当此代码运行时,下面是发生的情况:

变量 Foo 被解析为全局对象。
变量 bar 被解析为 Foo 的成员。这实际就是一次 COM 方法调用。
变量 blah 被解析为 Foo.bar 的成员。这又是一次 COM 方法调用。
变量 qaz 被解析为 foo.bar.blah 的成员。没有错,这还是一次 COM 方法调用。
调用 Foo.bar.blah.quaz(1)。再一次 COM 方法调用。懂了吗?
再次执行步骤 1 至步骤 3 以解析 baz。系统并不知道调用 qaz 是否改变对象模型,因此必须再次执行步骤 1 至 3 以解析 baz。
将 baz 解析为 Foo.bar.blah 的成员。赋予属性。
再次执行步骤 1 至步骤 3 以解析 zaq。
再次执行步骤 1 至步骤 3 以解析 abc。
正如您可看到的,效率相当差(且慢)。以 VBScript 写此代码的快速方法是:

Set myobj = Foo.bar.blah ' do the resolution of blah ONCE
Myobj.baz = myobj.qaz(1)
If Myobj.zaq = Myobj.abc Then '...

如果您使用 VBScript 5.0 或更高版本,您可以使用 With 语句写此代码:

With Foo.bar.blah
.baz = .qaz(1)
If .zaq = .abc Then '...
...
End With

注意此技巧也适用于 VB 程序设计。

技巧 13:避免重新确定数组的维数
应尽量避免 Redim 数组。就性能而言,如果计算机的物理内存大小有限,最好将数组的初始维数设置为其最不利的情况 - 或将维数设置为其最佳的情况,然后再按需要重新确定维数。这并非意味着,如果知道您不需要内存时,就随便分配几兆字节的内存。

下面的代码给您显示使用 Dim 和 Redim 不当的情形。

<%
Dim MyArray()
Redim MyArray(2)
MyArray(0) = ?hello?
MyArray(1) = ?good-bye?
MyArray(2) = ?farewell?
...
' some other code where you end up needing more space happens, then ...
Redim Preserve MyArray(5)
MyArray(3) = ?more stuff?
MyArray(4) = ?even more stuff?
MyArray(5) = ?yet more stuff?
%>

最好一开始就将数组的初始大小 Dim 正确(在本例中,是 5)比 Redim 数组使其更大好得多。您可能浪费一些内存(如果您没有使用所有的元素),但获得的好处是速度变得更快。

技巧 14:使用响应缓冲
您可以通过启用“响应缓冲”,将要输出的一整页缓冲起来。这样就将写到浏览器的量减到最少,从而改善总体性能。每个写操作都会产生很大的系统开销(在 IIS 中以及在通过网络发送的数据量方面),因此写操作越少越好。由于其启动慢且使用 Nagling 算法(用来减轻网络塞车情况),TCP/IP 在发送一些大的数据块时比必须发送许多小的数据块时的效率高得多。

有两个方法启用响应缓冲。第一种,您可以使用 Internet Services Manager 为整个应用程序启用响应缓冲。我们建议采用这种方法,在 IIS 4.0 和 IIS 5.0 中默认为新的 ASP 应用程序启用响应缓冲。第二种,可以在每个 ASP 页面的接近顶端的地方加入下面的代码行,从而启用响应缓冲:

<% Response.Buffer = True %>

此代码行必须在任何响应数据被写到浏览器之前执行(即,在任何 HTML 出现在 ASP 脚本之前以及在使用 Response.Cookies 集合设置任何 Cookies 之前)。一般来说,最好为整个应用程序启用响应缓冲。这样,您就不必在每个页面最上面写入上述的代码行。

Response.Flush
关于响应缓冲有一个常见的抱怨,就是用户感觉到 ASP 页面的响应速度很慢(即使整个响应时间得到改进),因为他们必须等到整个页面生成,然后他们才能看到东西。对于运行时间长的页面,您可以设置 Response.Buffer = False,禁用响应缓冲。但是,一个更好的策略是利用 Response.Flush 方法。这种方法将 ASP 转换的所有 HTML 送到浏览器。例如,在转换 1,000 行的表的前 100 行之后,ASP 可以调用 Response.Flush,强制将转换的结果送到浏览器,这样可使用户在其余的行准备好之前看到头 100 行。这种技术可以将响应缓冲与浏览器逐渐显示数据完美地结合在一起。

(注意在上面的 1,000 行表的举例中,许多浏览器在它们看到关闭 </table> 标记之前不会开始显示表。检查您的目标浏览器是否支持。为避免这种情况,将表分成多个具有较少行的表,并在每个表之后调用 Response.Flush。较新版本的 Internet Explorer 在表完全下载之前就开始显示表,如果您指定表列宽,显示速度就会特别快,这样做可避免强制 Internet Explorer 通过测量每个单元格的内容宽度来计算列宽。)

另一个关于响应缓冲的常见的抱怨是,当产生非常大的页面时,将占用许多服务器内存。撇开产生大页面的方法不谈,这种问题也可通过巧妙使用 Response.Flush 来加以解决。

技巧 15:批处理内嵌脚本和 Response.Write 语句
VBScript 语法 <% = expression %> 将“expression”的值写到 ASP 输出流中。如果响应缓冲未启用,那么执行其中的每一条语句,都会以许多小的数据包通过网络将数据写到浏览器中。这样速度很慢。而且穿插执行少量的脚本和 HTML,将引起脚本引擎和 HTML 之间的切换,从而降低性能。因此,使用下面的技巧:使用 Response.Write 调用代替捆绑紧密的内嵌表达式。例如,在下面的示例中,在每一行的每一字段对响应流有一次写操作,每一行在 VBScript 和 HTML 之间有许多切换:

<table>
<% For Each fld in rs.Fields %>
<th><% = fld.Name %></th>
<%
Next
While Not rs.EOF
%>
<tr>
<% For Each fld in rs.Fields %>
<td><% = fld.Value %></td>
<% Next
</tr>
<% rs.MoveNext
Wend %>
</table>

下面的代码更有效,每一行对响应流有一次写操作。所有的代码都包含在一个 VBScript 块内:

<table>
<%
For each fld in rs.Fields
Response.Write (?<th>? & fld.Name & ?</th>? & vbCrLf)
Next
While Not rs.EOF
Response.Write (?<tr>?)
For Each fld in rs.Fields %>
Response.Write(?<td>? & fld.Value & ?</td>? & vbCrLf)
Next
Response.Write ?</tr>?
Wend
%>
</table>

当禁用响应缓冲时,这一技巧的效果特别大。最好启用响应缓冲,然后看批处理 Response.Write 是否有助于提高性能。

(在这一特定举例中,建立表主体的嵌套循环 (While Not rs.EOF...) 可以用仔细构建的 GetString 调用来替代。)

技巧 16:如果页面需要很长时间才能完成,那么执行前使用 Response.IsClientConnected
如果用户性急,他们可能会在您开始执行他们的请求之前,就会放弃 ASP 页面。如果他们单击刷新或移到服务器上的另一个页面,在 ASP 请求队列的末尾就有一个新的请求等候,在队列的中间有一个断开连接的请求。当服务器的负载很高时(因此请求队列就会很长,响应时间也会相应地变长),就会经常发生这种情况,这样只能使情况变得更糟。如果用户不再连接,执行 ASP 页面(特别是慢的、大的 ASP 页面)已没有任何意义。您可以使用 Response.IsClientConnected 属性检查这一情况。如果它返回 False,则应调用 Response.End 并放弃页的其余部分。事实上,IIS 5.0 已将这一做法编为程序 - 每当 ASP 即将执行新请求时,它就会检查请求在队列中已等候了多长时间。如果已经在那里等候了多于 3 秒钟,ASP 将检查客户机是否仍处于连接状态,如果没有连接,就立即终止请求。您可以在配置数据库中使用 AspQueueConnectionTestTime 设置将超时时间由 3 秒调整为其它值。

如果页面要花很长时间才能执行完,也可以不时地检查 Response.IsClientConnected。当启用了响应缓冲时,最好不时地执行 Response.Flush,以用户知道,正在发生什么事。

注意 在 IIS 4.0 上,除非先执行了 Response.Write,否则 Response.IsClientConnected 就不能正常工作。如果启用了缓冲,您也必须执行 Response.Flush。在 IIS 5.0 上,却没有必要这样做,- Response.IsClientConnected 工作正常。在任何情况下,Response.IsClientConnected 都会有一些开销,因此只有在一个操作至少要花(比方说) 500 毫秒(如果您想维持每秒钟数十页的吞吐量,这是一个很长的时间)才使用它。经验表明,不要每次重复执行紧密循环时都调用它,如显示表的许多行时 - 每隔二十或五十行调用一次可能比较合适。

技巧 17:使用 <OBJECT> 标记例示对象
如果要引用不在所有代码路径(特别是服务器或应用程序作用域的对象)中使用的对象,使用 Global.asa 中 <object runat=server id=objname> 标记声明它们,而不使用 Server.CreateObject 方法。Server.CreateObject 能立即创建对象。如果以后不再使用该对象,您就浪费了资源。<object id=objname> 标记声明 objname,但在其方法或属性第一次使用以前,不会创建 objname。

这又是一个惰性计算的例子。

技巧 18:对于 ADO 和其它组件使用 TypeLib 声明
当使用 ADO 时,开发人员经常加入 adovbs.txt,以访问 ADO 的各种常量。在要使用常量的每个页面中必须包含此文件。此常量文件相当大,给每个 ASP 页面的编译时间和脚本大小增加了许多系统开销。

IIS 5.0 引入了绑定到组件类型库的功能。这可使您引用类型库一次,并将其用在每个 ASP 页面上。每个页面不会产生编译常量文件的开销,且组件开发人员不必建立 VBScript#_include 文件以在 ASP 上使用。

要访问 ADO TypeLib,将下面一条语句放在 Global.asa 中。

<!-- METADATA NAME=?Microsoft ActiveX Data Objects 2.5 Library?
TYPE=?TypeLib? UUID=?{00000205-0000-0010-8000-00AA006D2EA4}? -->

<!-- METADATA TYPE=?TypeLib?
FILE=?C:\Program Files\Common Files\system\ado\msado15.dll? -->

技巧 19: 利用浏览器的验证功能
现今的浏览器对一些高级功能如 XML、DHTML、Java 小程序和远程数据服务提供支持。尽可能使用这些功能。所有这些技术都可以执行客户机端验证和数据缓存,免去了到 Web 服务器的往返。如果您在运行一个智能浏览器,那么浏览器就能为您进行一些验证(例如,在执行 POST 之前,检查信用卡校验和是否有效)。尽可能使用这一功能。通过减少客户-服务器之间的往返,可降低 Web 服务器上的负载,并能减少网络通信量(虽然发送到浏览器的第一个页面可能比较大)以及服务器访问的任何后端资源。此外,用户不必像住常一样读取新页,从而用户的感觉会好一些。这样做并不意味着您可以不进行服务器端验证 - 您还应始终进行服务器端验证。这可以防止由于某种原因(如黑客,或浏览器不运行客户机端验证例程)客户机产生错误的数据。

人们已经进行了大量的工作,开发“独立于浏览器”的 HTML。正是由于这种忧虑,开发人员不愿再使用流行的浏览器功能,但这些功能本可以改善性能。对于一些真正的高性能站点,必须关心浏览器“访问”问题,一个好的策略是优化页面,使其适应流行的浏览器。使用浏览器功能组件,可以在 ASP 中方便地检测到浏览器功能。Microsoft FrontPage 等工具有助于设计适合于浏览器和指定 HTML 版本的代码。参见 When is Better Worse?Weighing the Technology Trade-Offs,以了解更进一步的讨论。

技巧 20:避免在循环语句中使用字符串串联
许多人在循环语句中建立一个字符串,如下所示:

s = ?<table>? & vbCrLf
For Each fld in rs.Fields
s = s & ? <th>? & fld.Name & ?</th> ?
Next

While Not rs.EOF
s = s & vbCrLf & ? <tr>?
For Each fld in rs.Fields
s = s & ? <td>? & fld.Value & ?</td> ?
Next
s = s & ? </tr>?
rs.MoveNext
Wend

s = s & vbCrLf & ?</table>? & vbCrLf
Response.Write s

采用这种方法会出现一些问题。第一个问题是反复串联字符串需要花两次方的时间,更通俗地说,运行这种循环语句所花的时间与记录数乘以字段数所得值的平方成正比。举一个更简单的例子,就可以更清楚地说明这一问题。

s = ??
For i = Asc(?A?) to Asc(?Z?)
s = s & Chr(i)
Next

在第一次迭代中,您获得了一个字符的字符串 ?A?。在第二次迭代中,VBScript 必须重新分配字符串并将两个字符 (?AB?) 复制到 s 中。在第三次迭代中,它还必须再次重新分配 s 并将三个字符复制到 s 中。在 N 次(第 26 次)迭代中,它必须重新分配并将 N 个字符复制到 s 中。总共就是 1+2+3+...+N,即 N*(N+1)/2 次复制。

在上面的记录集举例中,如果有 100 个记录和 5 个字段,内循环将执行 100*5 = 500 次,所有的复制和重新分配所花的时间与 500*500 = 250,000 成正比。这对于中等大小的记录集来说复制操作太多了。

在本例中,代码可以用 Response.Write() 或内嵌脚本 (<% = fld.Value %>) 替代字符串串联来改进。如果启用了响应缓冲的话(应该的),这样做就会更快,因为 Response.Write 只将数据附加到响应缓冲的末尾。并不涉及重新分配,因此效率很高。

在将 ADO 记录集转换为 HTML 表的特定情况下,应考虑使用 GetRows 或 GetString。

如果在 JScript 中串联字符串,特别建议使用 += 运算符,即,使用 s += ?某字符串?,而不使用 s = s + ?某字符串?。

技巧 21:启用浏览器和代理缓存
在默认情况下,ASP 禁止在浏览器和代理中进行缓存。这是有意义的,因为就实质而言 ASP 页面是动态的,上面有随时间不断变化的潜在信息。如果页面不要求在每个视图上进行刷新,您应启用浏览器和代理缓存。这可使浏览器和代理在一定的时间内使用页面的“缓存”副本,您可以控制时间的长短。缓存可以大大减轻服务器上的负载,缩短用户的等待时间。

哪一种动态页面可作为要缓存的页面呢?下面举一些例子:

天气预报页面,在此页面上,每隔 5 分钟更新一次天气预报。
列出新闻条目或新闻稿的主页,它一天更新两次。
共同基金业绩列表,在此列表中,基本统计信息每隔几小时更新一次。
注意,在使用浏览器或代理缓存的情况下,Web 服务器上记录的访问次数减少了。如果您想准确地测量所有页面视图或张帖公布,您就不希望使用浏览器和代理缓存。

浏览器缓存由 HTTP“过期”报头控制,该报头由 Web 服务器发送给浏览器。ASP 提供两个简单的机制发送此报头。要设置页面使其过多少分钟后到期,则应设置 Response.Expires 属性。下面的例子告诉浏览器内容在 10 分钟内过期:

<% Response.Expires = 10 %>

若将 Response.Expires 设置为负数或 0,则禁用缓存。一定要使用大的负数,如 -1000(略多于一天),以避免服务器和浏览器时钟之间的不匹配。第二个属性 Response.ExpiresAbsolute 将使您设置内容过期的具体时间:

<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>

您可以不使用 Response 对象设置过期时间,而将 <META> 标记写进 HTML,通常写在 HTML 文件的 <HEAD> 部分。一些浏览器将遵照此指令,而代理则不然。

<META HTTP-EQUIV=?Expires? VALUE=?May 31,2001 13:30:15?>

最后,您可以使用 Response.CacheControl 属性,指示其内容是否可以让 HTTP 代理缓存。若将此属性设置为“Public”,代理就可以缓存此内容。

<% Response.CacheControl = ?Public? %>

在默认情况下,此属性被设置为“Private”。注意,对于显示某用户特定数据的页面,不应启用代理缓存,因为代理可能给用户提供属于其他用户的页面。

技巧 22:尽可能使用 Server.Transfer 代替 Response.Redirect
Response.Redirect 让浏览器请求另一个页面。此函数常用来将用户重定向到一个登录或错误页面。因为重定向强制请求新页面,结果是浏览器必须到 Web 服务器往返两次,且 Web 服务器必须多处理一个请求。IIS 5.0 引入了一个新的函数 Server.Transfer,它将执行转移到同一台服务器上的另一个 ASP 页。这样就避免多余的浏览器-Web-服务器的往返,从而改善了总体系统性能以及缩短了用户的响应时间。检查“重定向”中的“新的方向”,上面应该是 Server.Transfer 和 Server.Execute。

另请参见 Leveraging ASP in IIS 5.0,了解 IIS 5.0 和 ASP 3.0 新功能的完整列表。

技巧 23:在目录 URL 中使用后斜杠
一个相关的技巧是确保在指向目录的 URL 中使用后斜杠 (/)。如果您省略了后斜杠,浏览器就会向服务器发出请求,只是为了告诉服务器,它在请求目录。浏览器就会发出第二个请求,将斜杠附加到 URL 后面,只有此后,服务器才能以该目录的默认文档或目录列表(如果没有默认文档且启用了目录浏览的话)响应。附加斜杠可省去第一个、无用的住返。为便于用户阅读,可以省略显示名称中的后斜杠。

例如,写:

<a href=?http://msdn.microsoft.com/workshop/? title=?MSDN Web
Workshop?>http://msdn.microsoft.com/workshop</a>

这也适用于指向 Web 站点上主页的 URL:使用下面的:<a href=?http://msdn.microsoft.com/?>,而不使用 <a href=?http://msdn.microsoft.com?>。

技巧 24:避免使用服务器变量
访问服务器变量会使 Web 站点向服务器发出一个特殊请求,并收集所有服务器变量,而不只是您请求的那个变量。这种情况类似于,在发霉的阁楼上,在一个文件夹中查找某个文件。当您想要找那个文件时,您必须去阁楼上,先找到文件夹,然后才能找到这份文件。当您请求服务器变量时,发生的情况是一样的 - 您第一次请求服务器变量时,就会使性能受到影响。后面的对其它服务器变量的请求,则不会对性能产生影响。

决不要访问非限定的 Request 对象(例如,Request("Data"))。对于不在 Request.Cookies、Request.Form、Request.QueryString 或 Request.ClientCertificate 中的项目,则隐式调用 Request.ServerVariables。Request.ServerVariables 集合比其它集合慢得多。

技巧 25:升级到最新和最出色的
系统组件是恒定的,我们建议您将它们升级到最新和最好的配置。最好升级到 Windows 2000(因此,也应升级到 IIS 5.0、ADO 2.5、MSXML 2.5、Internet Explorer 5.0、VBScript 5.1 和 JScript 5.1)。在多处理器计算机上,实施 IIS 5.0 和 ADO 2.5 可显著改善性能。在 Windows 2000 下,ASP 可以很好地扩展到四个处理器或更多,而在 IIS 4.0 下,ASP 的扩展性不能超出两个处理器。在应用程序中使用的脚本代码和 ADO 越多,升级到 Windows 2000 之后,性能的改善就会越多。

如果目前还不能升级到 Windows 2000,您可以升级到 SQL Server、ADO、VBScript 和 JScript、MSXML、Internet Explorer 和 NT 4 Service Packs 的最新版本。它们均可提高性能和可靠性。

技巧 26:优化 Web 服务器
有多种 IIS 优化参数可以改善站点性能。例如,对于 IIS 4.0,我们常常发现,增加 ASP ProcessorThreadMax 参数(参见 IIS 文档)可以显著改善性能,特别是在倾向于等待后端资源(如数据库)或其它中间产品(如屏幕刷)的站点上。在 IIS 5.0 中,您可能发现启用 ASP Thread Gating 比查找一个 AspProcessorThreadMax 最佳设置效率更高,这一点现在已为大家所熟知。

有关较好的参考资料,参见下面的优化 IIS。

最佳的配置设置取决于(其中一些因素)应用程序代码、运行所在的系统硬件和客户机工作负荷。找到最佳设置的唯一方法是进行性能测试,这是我们在下一个技巧中所要讨论的。

技巧 27:进行性能测试
正如我们在前面已经讲过,性能是一个特征。如果您想要改善站点的性能,那么就制定一个性能目标,然后逐步改进,直到达到目标为止。不要,就不进行任何性能测试。通常,在项目结束时,再作必需的结构调整已经为时太晚,您的客户将为此感到失望。将性能测试作为您日常测试的一部分来进行。可以对单个组件分别进行性能测试,如针对 ASP 页或 COM 对象,或将站点作为一个整体来测试。

许多人使用单个浏览器请求页面,来测试 Web 站点的性能。这样做就会给您一个感觉,即站点的响应能力很好,但这样做实际上并不能告诉您在负载条件下站点的性能如何。

一般情况下,要想准确地测试性能,您需要一个专门的测试环境。此环境应包括硬件,其处理器速度、处理器数量、内存、磁盘、网络配置等方面与生产环境的硬件相似。其次,您必须指定客户机的工作负荷:有多少同时的用户,他们发出请求的频率,他们点击页面的类型等等。如果您没有站点实际使用情况的数据,您必须估计一下使用的情况。最后,您需要一个可以模拟预期客户机工作负荷的工具。有了这些工具,您就可以开始回答诸如“如果我有 N 个同时的用户,那么需要多少服务器?”之类的问题。您还可以找出出现瓶颈的原因,并以此为目标进行优化。

下面列出了一些好的 Web 负载测试工具。我们特别推荐 Microsoft Web Application Stress (WAS) 工具包。WAS 可使您记录测试脚本,然后模拟数百或成千上万个用户访问 Web 服务器。WAS 报告很多统计信息,包括每秒钟的请求数,响应时间分布情况和错误计数。WAS 有丰富的客户机界面和基于 Web 的界面两种,Web 界面可使您进行远程测试。

一定要阅读 IIS 5.0 Tuning Guide。

技巧 28:阅读资源链接
下面是一些与性能有关的出色的资源链接。如果您想了解有关信息,请阅读 Developing Scalable Web Applications。

资源
优化 ASP 脚本

优化 IIS

ADO 和 SQL Server

ASP 组件和线程模型

词典组件

会话状态

性能和可扩展性

工具

书目

ASP Web 站点

ASP 样式

XML

优化 ASP 脚本
Developing Scalable Web Applications

Got Any Cache? Nancy Winnick Cluts 著

Maximizing the Performance of Your Active Server Pages,Nancy Winnick Cluts 著

15 Seconds: Performance Section

Enhancing Performance in ASP - Part I,Wayne Plourde 著

When is Better Worse? Weighing the Technology Trade-Offs,Nancy Winnick Cluts 著

Speed and Optimization Resources,Charles Carroll 著

优化 IIS
The Art and Science of Web Server Tuning with Internet Information Services 5.0

Leveraging ASP in IIS 5.0,J.D. Meier 著

Tuning IIS 4.0 for High Volume Sites,Michael Stephenson 著

Tuning Internet Information Server Performance,Mike Moore 著

Navigating the Maze of Settings for Web Server Performance Optimization,Todd Wanke 著

Managing Internet Information Server 4.0 for Performance,Hans Hugli 著

ADO 和 SQL Server
Top Ten Tips: Accessing SQL Through ADO and ASP,J.D. Meier 著

Improve the Performance of your MDAC Application,Suresh Kannan 著

Pooling in the Microsoft Data Access Components,Leland Ahlbeck 和 Don Willits 合著

SQL Server: Performance Benchmarks and Guides

Improving the Performance of Data Access Components with IIS 4.0,Leland Ahlbeck 著

Microsoft Data Access Components (MDAC) and ActiveX Data Objects (ADO) Performance Tips,Leland Ahlbeck 著

Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Server Perspective,Damien Lindauer 著

Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Application Perspective,Damien Lindauer 著

Accessing Recordsets over the Internet,Dino Esposito 著

ASP 组件和线程模型
ASP Component Guidelines,J.D. Meier 著

Q243548: INFO: Design Guidelines for VB Components under ASP

Threading Models Explained,Nancy Winnick Cluts 著

So Happy Together? Using ActiveX components with Active Server Pages,Nancy Winnick Cluts 著

Developing Active Server Components with ATL,George Reilly 著

Agility in Server Components,Neil Allain 著

Building High-Performance Middle-Tier Components with C++,Jon Flanders 著

Active Server Pages and COM Apartments,Don Box 著

House of COM: Active Server Pages,Don Box 著

House of COM: Contexts,Don Box 著

House of COM: Performance Trade-offs of the Windows 2000 Component Execution Environment,Don Box 著

Building COM Components That Take Full Advantage of Visual Basic and Scripting,Ivo Salmre 著

Component Design Principles for MTS

词典组件
Creating a Page Cache Object,Robert Coleridge 著

Abridging the Dictionary Object: The ASP Team Creates a Lookup-Table Object,Robert Carter 著

Caprock Dictionary

Site Server Commerce Edition includes a dictionary component

会话状态
Q175167: HOWTO: Persisting Values Without Sessions

Q157906: HOWTO: How To Maintain State Across Pages with VBScript

XML-based Persistence Behaviors Fix Web Farm Headaches,Aaron Skonnard 著

House of COM: Stateless Programming,Don Box 著

性能和扩展性
Blueprint for Building Web Sites Using the Microsoft Windows DNA Platform

Server Performance and Scalability Killers,George Reilly 著

Microsoft Visual Studio Scalability Center

Fitch & Mather Stocks 2000

Tuning the FMStocks Application

High-Performance Visual Basic Apps,Ken Spencer 著

Duwamish Books,Phase 4

Top Windows DNA Performance Mistakes and How to Prevent Them,Gary Geiger 和 Jon Pulsipher 合著

Building from Static HTML to High-Performance Web-Farms,Shawn Bice 著

工具
Microsoft Web Application Stress Tool

I Can't Stress It Enough -- Load Test Your ASP Application,J.D. Meier 著

Windows DNA Performance Kit

Monitoring Events in Distributed Applications Using Visual Studio Analyzer,Mai-lan Tomsen 著

书目
Professional Active Server Pages 3.0,Wrox Press(特别是第 26 章:Optimizing ASP Performance,George Reilly 和 Matthew Gibbs 合著)。

Microsoft Internet Information Services 5.0 Resource Guide(与 Windows 2000 Server Resource Kit 在一起),Microsoft Press。

Microsoft Internet Information Server Resource Kit(用于 IIS 4.0),Microsoft Press。

Programming Distributed Applications with COM and Microsoft Visual Basic 6.0,Ted Pattison 著,Microsoft Press。

Effective COM,Don Box、Keith Brown、Tim Ewald 和 Chris Sells 合著;Addison-Wesley。

Developing Web Usability: The Practice of Simplicity,Jakob Nielsen 著,New Riders。

ASP Web 站点
Microsoft TechNet for IIS

LearnASP.com

4GuysFromRolla.com

15Seconds.com

AspToday.com

Asp101.com

AspLists.com。许多专业的邮件列表包括:

Fast Code!
ASP Advanced
Not NewbieState Management
Scalability
Visual Basic Components
XML
C++/ATL Component Building
UseIt.com: Web 可用性

ASP 样式
ASP Best Practices,George Reilly 著

ASP Quick Lessons,Charles Carroll 著

Planning for ASP,John Meade 著

ASP Guidelines,J.D. Meier 著

XML
Inside XML Performance,Chris Lovett 著

Inside MSXML3 Performance,Chris Lovett 著

网站优化的十大奇招妙技

  1、 选择有效的关键字:

  关键字是描述你的产品及服务的词语,选择适当的关键字是建立一个高排名网站的第一步。选择关键字的一个重要的技巧是选取那些常为人们在搜索时所用到的关键字。

  2、 理解关键字:

  在你收集所需的关键字之前,明白一般人是怎样用关键字是十分重要的。人们在搜索的时候一般是不会使用单个词,而是用短语或者词组。这样对于网站优化起到更重要的作用。

  3、 找出有效的关键字:

  下面的一个网址包括了测试关键字使用频率的工具:http://www.trafficzap.com/ 的 Keyword Generator

  4、 选取关键字技巧:

  A:认真思索

  用笔写下与你的网站或产品有关的所有关键字,先不要对这些关键字进行审评。不要局限于你是卖什么的,尽量站在你客人方面考虑。那些人会为你的网站带来利益,尽量站在这些人的角度想。

  B:多问周围人的意见

  讲你的家里人,朋友,同学怎样的词语适合描述你的产品或网站。他们很有可能会找出一些你连想到没想过的词语。

  C:分析日志文档:

  日志文档将会告诉你,人们是使用什么关键字来访问你的网站的。(有些网站在建站的时候会安装相应的工具来生成日志文档供网管参考)

  D:参考其他网站:

  参照那些主题与你相似或相同的网站,看一下他们的meta keyword 是怎么写的。这样你有可能会得到意外的关键字,但是不要直接将人家的模板粘贴过来,因为你不知道网管在设计网站之前对关键字进行了那些可能性的研究。这主要是用于关键字研究。

  E:找出错误的拼写(多用于英文)

  有很多关键字人们会经常拼写错误的,找出这些经常出现错误拼写的词或词组可以为你带来额外的流量。(就GOOLE来说,它有检查拼写错误的功能。建议不要用拼写错误的词、词组作关键字)

  1、 处理关键字:

  到了这一步,你已经收集了很多与你的网站或产品有关的关键字了。接下来的工作就是把收集到的关键字进行组合,把它们组成常用的词组或短语。很多人在搜索的时候会使用两个或三个字组成词。据统计,平均是2.3个字。不要用普通的,单个字作为关键字。这样的关键字很难排到搜索引擎的前十位。例如:你有以下几个关键字:“搜索引擎、软件、提高”,试着把他们组合为“搜索引擎软件”、“搜索引擎提高”等。把字组成关键字短语有利于提高你网站的排名,你将会更有效提高你网站访问量。例如:很少人会用“搜索引擎”或者“软件”。

  2、 舍弃一些关键字: 寻找出那些搜索时很少用到的关键字:

  A:在英文里,在搜索引擎大小写是没有区别的。

  B:拼写错误的关键字是没用的,但是找到一个经常出现拼写错误码的词可以额外地提高你的访问量

  C:去除那些停用的词,在英文里有“the, for , a ,” 等。中文里有“的,地,你,我”等。

  D:没有人会用“最好的”,“疯狂的”等词语进行搜索。如果你的网站里有类似的词,最好把他去除。

  选择最佳关键字:

  如果你按照上述所说,你一定列出了一大堆的关键字。尽管,你已经去除了一些没人使用的。但是对于你来说还是太多了。现在是时候进入关键字优化的最后一步了。

  提示:

  试着用剩余的关键字在搜索引擎中进行搜索,不要把焦点放在最流行的关键字上。有时候,次关键字排名起来还是比较容易的。因为最流行的关键字会存在着更多的竞争对手,而次关键字反之。在选择关键字时的技巧是找出关键字需求与关键字竞争的平衡点,即所选关键字竞争不是很激烈。

  为什么要使用html的meta标签?

  1、

  meta标签是内嵌在你网页中的特殊html标签,包含着你有关于你网页的一些隐藏信息。Meat标签的作用是向搜索引擎解释你的网页是有关哪方面信息的。对于高级的搜索引擎来说,html 的meta 标签并不是什么新奇的东西。但是无论如何它是一个优秀网页不可缺少的。下面我们就它进行一些讲解吧。

  2、

  当你计划搜索引擎优化策略是meta标签是非常重要的。尽管如此,一般的加入meta 并不能帮助你在搜索引擎中获得更好的排名。有好几种meta标签,但重要的有以下几个:description标签, keywords标签, title标签(严格来说title不算是一个标签)。当你不时刷新标签时这几个标签显得特别的重要。如果你希望搜索引擎对你的网站进行索引时就会用到 html标签的重定向(redirect)标签与robots标签.

  注意:调查表只有20%的网页用到“关键字”与“描述”标签(即keyword, description)

  多个关键字用逗号分开。

  3、 title 标签

  title 标签可能是你网页中最重要的标签,它是你网页中最先看到的部分。把它放在description 与 keyword前。在这个标签中最好是加上你网站的关键字,title标签在搜索引擎的搜索中占有非常重要的地位。最好是把它放在其他meta标签前,这更有利于你网站的排名。(注意:有些搜索引擎会按title标签的字母的优先权进行排名,尽量在你的title中使用开始的字母)title标签是人们在搜索引擎中第一个看到有关你网站的描述,所以尽量把它弄得简单、明了。让人一看就知道你的网站是关于什么的。

  4、 Description标签

  Description标签就在title后面,该标签可以是一小段(一个或者两个句子)。用于描述你网站。与title标签一样,这也是人们在搜索引擎列表中链接到你网站的点击。这些描述将鼓动人们去浏览你的网站而不是你竞争对手的。(描述不能太夸张。不然,当访问者到你网站发现内容根本不是你说的那个样子,那么他很快就会退出去。)很多搜索引擎允许描述的字数在150个左右,所以你要保证你的描述在150以下,否则搜索引擎会自动把多余的部分剪去从而造成你网站的描述的不完整。搜索引擎认为描述里的关键字远比网页中的内容要重要(好像现在这种情况不是那么明显了)。真如上所述,这里提供了非常重要的信息:确定你的描述能正确的反映你网站的主题,尽量在描述中加入你主要的关键字,越靠meta的关键字意义越大。这样会突显你的关键字。

  现在大多的搜索引擎(google除外)都会支持descriptin标签。如果你不使用的话你将会失去排名靠前的可能。

  5、keyword 标签

  相比于description与title标签,keyword标签显得并不是那么重要了。有些搜索引擎把它完全地忽略,但是使用下正确的keyword标签对提高排名仍然有效。

  除了搜索引擎外,一般情况下人们是看不到的。keyword标签是一个隐藏的标签,向搜索引擎提供了一组与你的页面有关的的关键字或关键短语列表。你可以用相应的工具找出一系列适用于你网站的关键字。(注意:关键字标签中只能包括与你本页内容相关的关键字列表。所有在这里的关键字必须与页面的内容相联系。)

  提示:在你每一个页面中组织相关的关键字,每个页面必须专注于不同的产品或者内容。在标签中列满关键字对于提高你网站的排名并没有好处。多个关键字间用逗号用隔,逗号表示是逻辑“或”的意思。空格表示逻辑“与”。这是正式在keyword标签中描述关键字必须的。尽管如此,很多搜索引擎也会把关键字间以空格分开以达到能搜索出更相关的结果的目的。这样做的意义是,搜索引擎会把空格分开的关键字根据一定的方式自由组合。可以尝试用两种方法,看哪一种更加适合你。

  关键字不宜以同一形式重复3-6次,一般这已经认为是最大的关键字重复数(好像现在又发生了变化)。所以,尽量避免把你的关键字一次又一次地不断重复。这对于每一个搜索引擎来说是SPAM(关键字垃圾),你会因此而受到惩罚。大多数的搜索引擎会允许你在keyword标签中使用最多1000个字符。通常,对每一个页面使用相关连的关键字会提高你网站的排名。一个很重要的因素是你关键字冗余度,如果你一个关键字是一个字符,而你的keyword 标签中有100个字符,那么你关键字的冗余度就为1%。搜索引擎将会利用相关的算法对你的关键字冗余度进行统计你网页中的每一个重要的词或短语。去除多余的关键字有利于提高你网站的排名。

  基本搜索引擎优化策略:

  为什么有的网站能在搜索引擎上排名很好,而有的却连找到找不到呢?这个秘密何在呢?正如免费搜索引擎上的指导方针所说,有五个因素你是必须铭记于心的:

  1、 你网站的内容与主题。

  2、 每页的关键字数。

  3、 关键字放置的位置。

  4、 点击量。

  5、 链接数量。

  1、 搜索引擎优化策略:网站内容

  网站的实际内容是你网络优化策略的一个重要的因素。如果你想你的网站能在搜索结果中排得靠前,在你的网站中必须有实际的内容。搜索引擎的蜘蛛基本上是一个瞎子。他们只能对你网页内容进行判断你网站的质量,而不能从图片、flash动画上判断。在所有的页面中有充足的内容给搜索引擎进行索引是一个成功搜索引擎优化策略的基本需要。很容易明白,为什么一个没什么内容的网站很难排上去。人们在查找信息的时候,总是希望找到一个包括很多重要信息的网站。很自然,网页内容丰富的网站要比那些网页内容还那么丰富的网站排名要好得多。每个为他们的网站进行优化的站主牢记。不要忘记更新你的网站。无论是搜索引擎还是访问者都希望看到比较新的信息。这是什么意思呢?这就要求你要收集大量的信息,专注于这领域的变化。

  2、搜索引擎优化策略:关键字密度

  网页上通常会有数以百计的词语,那么搜索引擎怎样去分辨哪些是描述你的网站的重要的词语呢?搜索引擎会统计你一个页面的字数。那些重复出现的词或短语被认为比较重要些。搜索引擎利用自身的算法来统计你页面中每个字的重要程度。关键字数与该页面字数的比例称为关键字密度,这是一个搜索引擎优化策略最重要的一个因素。

  为了得到更好的排名,你的关键字必须在页面中出现若干次,或者在搜索引擎允许的范围内。

  怎样才能知道关键字的密度是多少才能得到较好的排名呢?很简单,只要你在搜索引擎中搜索你要优化的关键字,然后统计一下排在前面几个网站该关键字的密度就可以了。当然也有很多统计关键字密度的工具(你可以在本站上找到)。

  3、 索引擎优化策略:突出关键字

  在有价值的地方放置关键字,当你统计完你的页面需要多少个关键字后,接下来就是考虑把你的关键字放在网页的什么地方。突出关键字是吸引搜索引擎注意的一个最重要的因素。搜索引擎将会专注于你网页中某一部分的内容,处于这一关注部分的词语显得比其他部分的词语要重要得多。这就是所谓的“突出关键字”。

  A: Title 和meta 标签:在上一节已经提到,title 标签是网页中最重要的标签。所以在title中放置关键字显得非常重要。有一些搜索引擎会额外的注意“描述”与“关键字”标签。

  B: 标题(headings)
--
标题标签为你的访问者指明了哪些是网站中比较重要的内容。“标题”: 是处于
--
中的文字。在“标题”标签中能出现关键字对于提高你网站排名有很大的好处。

  C: 超链接文本: 你链接到一个网页与你网站内容相关,这一想法是非常正常的事。这也是关键字在链接文本中为什么那么重要。

  D: URL文本:在你的域名和你的网页中出现关键字对于搜索引擎排名会产生很大的影响。这样的关键字被称为“URL文本”,在另一个网站与你网站建立链接时,尽量使用关键字作为链接文字,这有利于提高你网站的重要性,从而影响到PR。

  E: 顶部:网页顶部的文本,每段开头的内容显得特别重要,所以,尽量在这些地方把关键字包含进来。

  4、 点击流行度

  另外一个在某些搜索引擎中影响排名的因素是点击流行度,在搜索结果中点击连接到你网页的次数会被统计。经常被点击的页面的点击流行度就较高。当访问者从搜索结果中点击你的网站时,搜索引擎将来给你网站奖励一定的分数。如果你的网站得到较高的点击量,那么你将来得到比那些点击量较低的网站更多的分数。不要尝试去重复点击你的网站,对于同一IP的重复点击,搜索引擎会将其删除。当再次重登陆到搜索引擎时会大大影响到排名。搜索引擎会认为这是一个无价值的页面。这并不是一个好的优化策略。

  5、 链接流行度

  链接流行度被认为是搜索引擎优化的一个主要因素。搜索引擎会认为外部链接较多的网站重要性也相对较高。不是所有的链接都是公平的,从高质量网站的链出会给你网站更多的分数。链接文字必须包含有你优化的关键字,这样也会提高你网站的排名。链接流行度并不是在你所能控制的范围,但是你可以按照以下的做法来提高链接流行度:

  A:做一个高质量的网站,如果人们发现他有有价值的内容,他们会主动的与你进行链接。

  B:使交换链接变得更简易。在交换链接页面放置交换链接代码,把交换链接的联系方式放在显眼的地方,方便伙伴与你交换。

  C:在搜索引擎中找出你竞争对手的链接伙伴,要求他们与你进行交换链接。互利的交换链接对双方都是有利的。

  D:在重要的网站中做广告或者在收费目录中提交你的网站。

  当然,你还可以向很多免费目录、黄页等提交。你还可以在你的作品中加上你的链接(如ebook ,发表的文章等)。

   门户页面—你的秘密武器

  管理员建立一个门户门户页面只有一个目的:使某些关键字或短语在某些搜索引擎上获得更好的排名。假设你走进了一家pizza餐厅,肯定有很多人来你的餐厅,但是不是所以的人都要同一口味的pizza。搜索引擎的工作原理也是一样的,他们不是都喜欢同一个页面的。

  有些时候你的网站在某个搜索引擎获得了较好的排名,但是在其他的搜索引擎中却找不到。所以是时候去建立一些门户页面去适应多个搜索引擎的“口味”。

  如果搜索引擎发现你的门户页面适合他的口味,你网站的排名将会提高。

  1、 垃圾与门户页面

  在过去,门户页面只是由几个关键字或者几幅图片组成,没有实际、有价值的内容。然后直接链到主站。人们喜欢使用一些软件自动生成多个门户页面,然后自动向众多搜索引擎提交,结果排名却反而更后了。

  那么门户页面对于网站排名真的起到了积极的作用了吗?有一些人还在不断的争论,这样的门户页面对某些搜索引擎来说仍然是有用的。低质量的门户页面没有实际工资的内容,会被搜索引擎认为是垃圾。

  2、 对搜索引擎友好的门户页面的组建

  如果使用得当的话,门户页面不会被搜索引擎误认为是垃圾。如果能建立高质量的门户页面,这对于提高网站排名会起到一个非常积极的作用。如果要用门户页面来提高你网站排名,你的门户页面必须给访问者提供足够多的信息、图片和链接。正如你的主站一样。

  一个好的门户页面应该像正式的页面一样,只不过是根据特定的搜索引擎而设计。以下这几是要切记:

  A、 没有必要对每一个搜索引擎建立相对的门户页面。把你的注意力放在那些对你网站没有什么好感的搜索引擎上(当然,如果所有的搜索引擎都不喜欢,那么你就 没有必要去建立门户页面,而是做好你的主站)

  B、 不要向主要的目录提交你的门户页面,因为这些目录只允许收录你的主站页面。否则,你将会得到惩罚。

  C、 在你建立门户页面前,你必须对所针对的搜擎引擎有比较深的了解。

  D、 有效的门户页面,只会用到1-2个关键字。如果用得太多,那么这样会导致相反的效果。把注意力尽量集中在你想优化的几个关键字上。

  E、 把门户页面建得尽量普通(即与正常的页面一样,不要让人一看就知道这是一个门户页面)通常情况下是用300-500个

  搜索引擎垃圾技术是利用不道德的技巧去提高自己搜索引擎上的排名。不诚实的网站管理员就是利用这样的手段去欺骗搜索引擎从而获得较高的排名。这样的做法会让你的网站在短期内排名得到提高,但是后果却是十分严重的。有可能导致搜索引擎把你的网站从他的数据库里永久删除!以下是九个经常使用到的搜索引擎垃圾技术:

  1、 隐藏文本:利用文本与背景色的相同来达到隐藏关键字的目的。这样,用户是看不到这样字,不影响用户的正常阅读,但是搜索引擎却一目了然。这是一种最常用的搜索引擎垃圾技术。

  2、 重复关键字:经常与隐藏文本一起使用。但是这种做法会不页面的底部不断的以小号字重复关键字,或者把它隐藏在meta标签里面。这是最流行的搜索引擎垃圾技术。

  3、使用无关关键字:从不在他们的网站中使用一些热门的关键字,而是使用一些与他们网站无关的关键字。这样,有些人用这些冷门的关键字进行搜索时就会找到他的网站。但是这样做是完全没有用的,当访问者发现这个网站不是他们想要的内容的时候,他们就会立即离开。这样做既欺骗了搜索引擎也欺骗了访问者。

  4、 隐藏标签:把关键字隐藏在html标签里面,如:style tags ,alt tags 等等。隐藏链接对一些搜索引擎来说也会被认为是搜索引擎垃圾技术,但另外一些则不是这样。

  5、 相同或相似页面:不要复制页面(或门户页面),或者给这些相同页面不同的名字然后又提交到搜索引擎中。这是搜索引擎跟分类目录都明显反对的。

  6、 页面交换技术:这是对搜索引擎访问时采用一个页面以提高在搜索引擎上的排名,而面对访问者的时候却采用另外一个页面。这样做也会在一时半刻得到不错的网站排名,但是后果是:一旦搜索引擎发现了,你的网站将会在他的数据库中永远除名。

  7、 链接搜索引擎垃圾技术:搜索引擎会认为那些通过自助链接系统建立的链接为搜索引擎垃圾技术。

  8、 无内容:网站没有专一的内容对于搜索者来说是垃圾网站。不合法的内容、复制的内容和那些全都是友情链接的网页,对于搜索引擎来说也是搜索引擎垃圾技术。

  9、 过度提交:每个搜索引擎都会限定一个网站提交网页的数量与提交的频率。在一个月之内不要向同一个搜索引擎提交多于一次(即只能提交一次),也不能向同一搜索引擎在一天之内提交多个页面。切记不要向他们提交门户页面。一定要根据搜索引擎的指导方针行事。

一个论坛凭什么能留住人

一个论坛、一个版块能留住会员的因素是多方面的,但是其中很重要的一点就是对版块的经营观念,有一些版主认为要想留住会员必需得发一些有吸引力的帖子才行。所以有些版主在论坛兴建的初期拼命写作,绞尽脑汁要码出一些好文章来,或者是到别的网站、论坛寻找一些精彩的帖子转帖过来,事实证明这样做版块上文章帖了一大堆人气的提升效果并不明显,这到底是为什么呢?

  会员来到论坛的目的无非有三:

  1.发表自己对生活、对社会、对工作的一些看法,渴望和别人交流。

  2.倾诉自己情感的得失、发泄现实生活中的愤懑、表达自己在生活中的感受。

  3.展示自己的能力、寻找知音和共鸣、体验在虚拟世界中成功的快感。

  从上面三点上来看会员们来论坛不是被动的欣赏,而是要主动的交流和互动。

  说白了,版主要确立的经营观念不是你来欣赏我,而是我要欣赏你。

  如果会员要欣赏好文章就无需来论坛了,各大网站、著名的网上书屋、文学专题网站上的热点新闻、好帖子、经典名著多如牛毛。论坛上文章的精彩程度无论如何都不能与之相比。

  论坛上最主要的功能、最有魅力之处是交流互动,在论坛兴建的初期版主贴出几篇象样的文章来吸引会员是