冲浪网站优化网立足洛阳是国内知名SEO服务商,是网站优化SEO学习,SEO技巧方法知识获取重要平台,提供高效的SEO及网站优化解决方案,提高目标网站的网站排名。

全国热线电话:13633878273

冲浪网站优化 / Products Center

seo培训教程:通过网站缓存提高网站的浏览速度

发布时间: 2013-09-08 20:27:49

我们做seo的,都需要网站浏览速度越快越好,快速的网站打开速度,不仅方便用户的阅读,提高用户的阅读体验,也方便搜索引擎的抓取,避免网站速度太慢,造成搜索引擎抓取间隔变长,造成网站快照更新不及时,甚至造成搜索引擎抓取错误,因此提高网站打开速度对seo作用非常重要,本文主要谈谈通过网站缓存技术提高网站的打开速度。

什么是网站缓存技术

网站缓存是一个临时文件,是把网站经常访问的页面,比如网站首页放在一个高速缓存文件夹内或者直接存储在内存中,当客户端浏览器访问该页面时,服务器直接从高速缓存文件夹或者网站服务器内存直接读取该页面提供给客户端浏览器,采用网站缓存技术的目的是提高服务器的处理速度,进而提高网站的打开速度。特别是大型门户网站,每天网站点击量非常大,造成服务器处理压力比较大,使用网站缓存技术,可以大大提高服务器的处理速度。

为什么需要网站缓存

网站缓存的目的是提高服务器的处理速度,减少服务器的压力,如果不使用网站缓存技术,每次客户端浏览器请求访问页面,服务器都要从数据库读取数据,然后提供给客户端,如果大量客户端请求,那么造成服务器频繁访问数据库,从而大量消耗服务器的端内存和cpu资源,还给数据库造成压力,从而导致网站访问速度变慢。网站缓存技术的原理,内存的访问速度大于硬盘的访问速度,硬盘的访问速度大于从数据库读取的速度。

什么网站需要网站缓存技术

无论静态网站还是动态网站都可以使用网站缓存技术,比如把高点击量的页面放到服务器的内存,当客户端浏览器访问该页面的时间,服务器可以直接从内存调用页面,提供给客户端浏览器,这样大大提高了服务器的处理速度。动态网站和静态网站相比,动态网站更需要网站缓存,由于动态网站频繁的读取数据库,造成网站数据库压力比较大,导致服务器处理速度变慢,造成网站打开速度变慢,如果使用缓存技术,把经常访问的页面放在一个缓存文件夹,当客户端浏览器访问的时间,服务器直接从这个缓存文件夹读取网站数据,大大提高了服务器的处理速度。

网站缓存可以分为客户端缓存和服务器端缓存

网站客户端缓存

客户端缓存又可以分为浏览器缓存、网关或代理服务器缓存

浏览器缓存,浏览器第一次访问网页时,该网页缓存文件保证到客户端本机,当该浏览器第二次访问相同的页面时,直接从本机读取数据,而不是从服务器端读取数据,特点是:直接从本机读取数据,打开速度非常快,缺点是不能和服务器端内容保持动态一致。

网关或代理服务器缓存,将网页缓存中网关服务器上,多用户访问同一个页面时,将直接从网关服务器把页面传送给用户。

浏览器缓存的控制,可以设置meta标签,可以设置数字,也可以设置时间,如下:

 <Meta http-equiv="Expires" Content="3600">

<Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT">

服务端缓存

服务端缓存分为:页面缓存、数据缓存、数据库缓存

1、页面缓存

页面缓存是将动态页面直接生成静态的页面放在服务器端,用户调取相同页面时,静态页面将直接下载到客户端,不再需要通过程序的运行和数据库的访问,大大节约了服务器的负载。
早期的网站很多使用发布系统来完成这个功能,在后台发布时将数据和页面模板整合成静态页面,存放在硬盘中。但这样的缺陷很明显,一是后台的程序的编写很复杂,二是缓存的控制只能通过人为的方式来控制,这对一些更新十分频繁的网站就是一个噩梦,网站可能在不停的做缓存的删除和重建。当然后来出现了一些自动更新这些缓存的框架,比如PHP的SMARTY模板技术,可以定义缓存过期的时间,自动去更新这些缓存。这对一些信息发布类网站已经确实适用了。
除了整个页面的缓存技术,还有一种技术叫做“网页片段缓存技术”,将页面的部分而不是全部进行缓存。代表作有ESI cache。

2、数据缓存

但是当WEB2.0兴起的今天,信息的发布已经不再是管理员统一发布的了,而是所有的用户都在发布信息,用户发布完信息后当然是想看到这些信息,而不是等到缓存时间到刷新后才看到这些数据,于是数据缓存的相关技术也就应运而生了。
比较有名的数据缓存框架有ehcache和 memcached。
  ehcache有很多缓存的分支(包括页面缓存的模块),但最核心的模块还是它的数据缓存部分,比如,当ehcache和hibernate进行整合时,能将查询出的对象集合放入内存中,下次如果再查询这个查询,将直接从内存中返回这个数据集合,不需要再进行数据库的查询,同时,你可以配置缓存的刷新模式,有read-only,nonstrict-read-write,read-write 几种模式,其中read-only表示缓存是不刷新的(要刷新就只有重启了),nonstrict-read-write表示刷新是不及时的,你可以设置超时的时间去刷新,read-write表示在数据发生变化时缓存都会发生刷新,具体怎么配置可能就要根据具体业务了。
  Memcached大致的原理也和ehcache 相同,将数据采用键值的形式存放在内存中,使用时可以将查询的md5作为键,查询的结果作为值。相对ehcache而言,memcached是一个工具,ehcache是一个框架,memcached更加底层更加灵活,当然你也要写相应的代码去使用它。
  这是一张网上的memcached图,说明了memcached在系统中的位置。

 3、数据库缓存

 


  数据库的缓存一般由数据库提供,比如ORACLE,可以对表建立高速缓存,提高对经常访问的数据的访问速度。

网站缓存的做法

网站缓存的做法分为两种,一种是内存缓存,把缓存内容直接存在内存中,优点是访问速度非常快,缺点是,由于内存一般比较小,不能存在过多的数据。另外一种是文件缓存,把网站缓存数据存在在硬盘中,优点是可以存储大容量数据,缺点是速度没有内存缓存速度快。

网页片段缓存的主要内容

 一般是共用的数据,比如网站的头部,网站的尾部等共用的数据使用网页片段缓存。

更新缓存时间的问题

合理设置更新缓存的时间,如果更新网站缓存时间过快,造成服务器更新缓存比较频率,加大了服务器的处理压力,如果更新缓存时间过长,造成缓存数据和最新数据不同步,不一致的情况。因此合理设置更新网站缓存的时间,理论上只要网站数据更新了,就应该更新网站缓存,以便客户可以浏览最新的内容。

 缓存机制的实现 – Web服务器端配置

一般说来,应该选择最新版本的Web服务器程序来部署。不仅因为它们包含更多利于缓存的功能,新版本往往在性能和安全性方面都有很多的改善。

Apache HTTP服务器

Apache有些可选的模块来包含这些头信息: 包括Expires和Cache-Control。 这些模块在1.2版本以上都支持;
 这些模块需要和apache一起编译;虽然他们已经包含在发布版本中,但缺省并没有启用。为了确定相应模块已经被启用:找到httpd程序并运行httpd -l 它会列出可用的模块,我们需要用的模块是mod_expires和mod_headers
•如 果这些模块不可用,你需要联系管理员,重新编译并包含这些模块。这些模块有时候通过配置文件中把注释掉的配置启用,或者在编译的时候增加-enable -module=expires和-enable-module=headers选项(在apache 1.3和以上版本)。 参考Apache发布版中的INSTALL文件;

Apache一旦启用了相应的模块,你就可以在.htaccess文件或者在服务器的access.conf文件中通过mod_expires设置副本什 么时候过期。你可设置过期从访问时间或文件修改时间开始计算,并且应用到某种文件类型上或缺省设置,参考模块的文档获得更多信息,或者遇到问题的时候向你身边的apache专家讨教。
 应用Cache-Control头信息,你需要使用mod_headers,它将允许你设置任意的HTTP头信息,参考mod_headers的文档可以获得更多资料;
 这里有个例子说明如何使用头信息:
•.htaccess文件允许web发布者使用命令只在配置文件中用到的命令。他影响到所在目录及其子目录;问一下你的服务器管理员确认这个功能是否启用了。

### 启用 mod_expires
 ExpiresActive On
 ### 设置 .gif 在被访问过后1个月过期。
ExpiresByType image/gif A2592000
 ### 其他文件设置为最后修改时间1天后过期
### (用了另外的语法)
ExpiresDefault “modification plus 1 day”
### 在index.html文件应用 Cache-Control头属性
<Files index.html>
 Header append Cache-Control “public, must-revalidate”
</Files>
•注意: 在适当情况下mod_expires会自动计算并插入Cache-Control:max-age 头信息

Apache 2.0的配置和1.3类似,更多信息可以参考2.0的mod_expires和mod_headers文档;

Microsoft IIS服务器

Microsoft的IIS可以非常容易的设置头信息,注意:这只针对IIS 4.0服务器,并且只能在NT服务器上运行。
 为网站的一个区域设置头信息,先要到管理员工具界面中,然后设置属性。选择HTTP Header选单,你会看到2个有趣的区域:启用内容过期和定制HTTP头信息。头一个设置会自动配置,第二个可以用于设置Cache-Control头信息;
 设置asp页面的头信息可以参考后面的ASP章节,也可以通过ISAPI模块设置头信息,细节请参考MSDN。

Netscape/iPlanet企业服务器

3.6版本以后,Netscape/iPlanet已经不能设置Expires头信息了,他从3.0版本开始支持HTTP 1.1的功能。这意味着HTTP 1.1的缓存(代理服务器/浏览器)优势都可以通过你对Cache-Control设置来获得。
 使用Cache-Control头信息,在管理服务器上选择内容管理|缓存设置目录。然后:使用资源选择器,选择你希望设置头信息的目录。设置完头信息后,点击“OK”。更多信息请参考Netscape/iPlanet企业服务器的手册。

缓存机制的实现:服务器端脚本

需要注意的一点是:也许服务器设置HTTP头信息比脚本语言更容易,但是两者你都应该使用。
 因为服务器端的脚本主要是为了动态内容,他本身不产生可缓存的文件页面,即使内容实际是可以缓存的。如果你的内容经常改变,但是不是每次页面请求都改变, 考虑设置一个Cache-Control: max-age头信息;大部分用户会在短时间内多次访问同一页面。例如: 用户点击“后退”按钮,即使没有新内容,他们仍然要再次从服务器下载内容查看。

CGI程序

CGI脚本是生成内容最流行的方式之一,你可以很容易在发送内容之前的扩展HTTP头信息;大部分CGI实现都需要你写 Content-Type头信息,例如这个Perl脚本:

#!/usr/bin/perl
 print “Content-type: text/html\n”;
print “Expires: Thu, 29 Oct 1998 17:04:19 GMT\n”;
print “\n”;
 ### 后面是内容体…

由于都是文本,你可以很容易通过内置函数生成Expires和其他日期相关的头信息。如果你使用Cache-Control: max-age;会更简单;

print “Cache-Control: max-age=600\n”;

这样脚本可以在被请求后缓存10分钟;这样用户如果按“后退”按钮,他们不会重新提交请求;
CGI的规范同时也允许客户端发送头信息,每个头信息都有一个‘HTTP_’的前缀;这样如果一个客户端发送一个If-Modified-Since请求,就是这样的:

HTTP_IF_MODIFIED_SINCE = Fri, 30 Oct 1998 14:19:41 GMT

参考一下cgi_buffer库,一个自动处理ETag的生成和校验的库,生成Content-Length属性和对内容进行gzip压缩。在Python脚本中也只需加入一行;

服务器端包含 Server Side Includes

SSI(经常使用.shtml扩展名)是网站发布者最早可以生成动态内容的方案。通过在页面中设置特别的标记,也成为一种嵌入HTML的脚本;
 大部分SSI的实现无法设置校验器,于是无法缓存。但是Apache可以通过对特定文件的组执行权限设置实现允许用户设置那种SSI可以被缓存;结合XbitHack调整整个目录。更多文档请参考mod_include文档。

PHP

PHP是一个内建在web服务器中的服务器端脚本语言,当做为HTML嵌入式脚本,很像SSI,但是有更多的选项,PHP可以在各种Web服务器上设置为CGI模式运行,或者做为Apache的模块;
 缺省PHP生成副本没有设置校验器,于是也无法缓存,但是开发者可以通过Header()函数来生成HTTP的头信息;
 例如:以下代码会生成一个Cache-Control头信息,并设置为3天以后过期的Expires头信息;

<?php
 Header(“Cache-Control: must-revalidate”);

 $offset = 60 * 60 * 24 * 3;
 $ExpStr = “Expires: ” . gmdate(“D, d M Y H:i:s”, time() + $offset) . ” GMT”;
Header($ExpStr);
 ?>

记住: Header()的输出必须先于所有其他HTML的输出;
 正如你看到的:你可以手工创建HTTP日期;PHP没有为你提供专门的函数(新版本已经让这个越来越容易了,请参考PHP的日期相关函数文档),当然,最简单的还是设置Cache-Control: max-age头信息,而且对于大部分情况都比较适用;
 更多信息,请参考header相关的文档;
 也请参考一下cgi_buffer库,自动处理ETag的生成和校验,Content-Length生成和内容的gzip压缩,PHP脚本只需包含1行代码;

Cold Fusion

 Cold Fusion是Macromedia的商业服务器端脚本引擎,并且支持多种Windows平台,Linux平台和多种Unix平台。Cold Fusion通过CFHEADER标记设置HTTP头信息相对容易。可惜的是:以下的Expires头信息的设置有些容易误导;

<CFHEADER NAME=”Expires” VALUE=”#Now()#”>

它并不像你想像的那样工作,因为时间(本例中为请求发起的时间)并不会被转换成一个符合HTTP时间,而且打印出副本的Cold fusion的日期/时间对象,大部分客户端会忽略或者将其转换成1970年1月1日。
 但是:Cold Fusion另外提供了一套日期格式化函数, GetHttpTimeSTring. 结合DateAdd函数,就很容易设置过期时间了,这里我们设置一个Header声明副本在1个月以后过期;

<cfheader name=”Expires” value=”#GetHttpTimeString(DateAdd(‘m’, 1, Now()))#”>

你也可以使用CFHEADER标签来设置Cache-Control: max-age等其他头信息;
 记住:Web服务器也会将头信息设置转给Cold Fusion(做为CGI运行的时候),检查你的服务器设置并确定你是否可以利用服务器设置代替Cold Fusion。

ASP和ASP.NET

在asp中设置HTTP头信息是:确认Response方法先于HTML内容输出前被调用,或者使用 Response.Buffer暂存输出;同样的:注意某些版本的IIS缺省设置会输出Cache-Control: private 头信息,必须声明成public才能被共享缓存服务器缓存。
IIS的ASP和其他web服务器都允许你设置HTTP头信息,例如: 设置过期时间,你可以设置Response对象的属性;

<% Response.Expires=1440 %>

设置请求的副本在输出的指定分钟后过期,类似的:也可以设置绝对的过期时间(确认你的HTTP日期格式正确)

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

Cache-Control头信息可以这样设置:

<% Response.CacheControl=”public” %>

在ASP.NET中,Response.Expires 已经不推荐使用了,正确的方法是通过Response.Cache设置Cache相关的头信息;

Response.Cache.SetExpires ( DateTime.Now.AddMinutes ( 60 ) ) ;
 Response.Cache.SetCacheability ( HttpCacheability.Public ) ;