这个是入门的第一篇,但是不是本书的第一页,本书的写作计划是,各自为政,写到一定的数量以后整理成册.当然,是在一定的范围内完成的.
计算机领域,最大的一次技术改进,就是发明了缓存,不管是操作系统,浏览器,各种编程语言,都提供了对缓存的支持.drupal也不例外,缓存在drupal中相当常见,可以说,drupal把缓存发挥到了极致.
很多人提到drupal,常常会质疑它的性能问题,特别是当知道drupal把所有的数据都存在到了数据库中时,这种质疑常常让一些原本打算使用drupal的用户,在drupal面前望而却步.在Drupal中,一个正常的页面的生成,如果把所有的步骤都走完的话,可能需要执行上百条数据库查询,(具体是数据根据实际情况而定),但是如果使用了缓存的话,仅需要一条查询或者几条查询就可以完成.这样就可以极大的提高drupal的性能了.Drupal内置的缓存机制,使得drupal能够应用到高负荷,高流量的网站,实际上,国外的许多大型的网站都是跑在drupal之上,具体的网站可以到创始人的个人网站上找.
对于我们的个人站点,我们看看怎样才能通过使用drupal的缓存机制,来优化我们的小站.我拿我自己的网站zhupou.cn作为例子吧,先看看网站上的设置。配置缓存的地方位于Site configuration(站点配置)下面的Performance(性能),如图所示,
在这里可以为匿名用户启用或者禁用页面缓存,另外就是设置CSS和JS,以优化带宽。Drupal的页面缓存,仅用于匿名用户,对登录用户不起作用,我见很多人想对登录用户也使用缓存,据说别的CMS可以实现这一点,我不知道drupal有没有现成的解决方案,来实现这一点,不过对于大多数网站,匿名用户应该可以占到总用户的80%,也就是大多数,所以我觉得仅对匿名用户,就抓住了问题的关键点了。
下面看看zhupou.cn的配置,让我们进入性能的管理界面admin/settings/performance。先看看页面缓存的设置。如图所示。
在这里,缓存模式,我用的是普通模式,最小缓存生命周期,我选的是6小时,同时启用了页面压缩。这里的配置仅仅作为参考。
下面是我的区块缓存配置在这里面启用了区块缓存,如图所示。
下面带宽优化配置,在这里JS,CSS文件的优化都被禁用。
为什么我这里,禁用了CSS和JS优化呢?其实我也不想禁用它,但是由于网站放在虚拟主机上,启用这两个选项,需要对files目录,以及压缩后的文件都具有“写”权限,而我不会在linux下面设置权限,具体一点说,我不知道在我的虚拟主机上如何设置这一权限。所以只好禁用。一会我给大家看看我本地机子上,启用这两项优化后的效果。
在这个页面的最后,是清空缓存数据的按钮,这个在网站的开发过程中非常有用。有时候,你会发现自己的站点越来越慢,那么到这里看看,点点这个清空缓存数据按钮,可能就会带给你不小的惊喜。
Drupal6在缓存的设置方面,对drupal5作了不小的改进,比如在这个页面,在5.x,就没有清空缓存数据(clear cached data)这一按钮,也没有区块缓存的配置选项,另外,在页面缓存的配置中,也没有页面压缩(Page compression)这一选项。
相关链接: Think in Drupal
缓存实验
事实上,我对缓存也是一知半解的,搞drupal一年多了,在这一点上,我唯一会作的是,遇到了问题,不管是不是与缓存有关,都先清缓存,有时,问题会解决掉,有时,问题仍然存在.过去,清空缓存的方法,我一直用的是,关闭站点,然后重新让它上线.当然也有别的方法.而在drupal6中,在性能的配置页面,专门为我们提供了一个清空缓存数据的按钮,这更方便了.像我这样的老手,在这方面的知识也不过如此,对于许多刚刚接触drupal的新手来说,这一点就更让人费解了.
我们做个实际的实验,以加深大家对drupal缓存的理解.刚刚我发了一篇文章” drupal缓存(cache)”,并且推到了首页.我是在IE7下面,以用户1(g089h515r806)的身份发帖的.当我再以用户1的什么,使用IE7访问首页时,我看到了以下内容:
用户g089h515r806在首页看到了新发的文章。点击文章标题,就可以进入文章的正文页面。
现在我以匿名用户的身份,使用Firefox浏览器,访问zhupou.cn首页,我看到了如下内容:
在首页,我看到的还是昨天的那篇文章(10/28/2008),还看不到新发的文章,也就是说,首页面,被drupal缓存了。至少要过6个小时以后,匿名用户才能看到刚才的更新。
在firefox下面,我以test这个用户登录后,再次来到首页,test看到了:
用户test登陆后,在首页看到了新发的“drupal缓存(cache)”这一文章,点击就可以浏览。从这里看到,对于管理员,登录用户,页面缓存是不起作用的。
我使用google的浏览器Chrome,以匿名用户的什么访问zhupou.cn的首页,仍然没有看到新发的文章。但是当我点击首页底部的1,2,3。。。这样链接中的2以后,重新点击1回到页面http://zhupou.cn/node,也就是页面的首页,我看到了以下内容:
我看到了新发的帖子了。在首页。但是当我把http://zhupou.cn/node改为http://zhupou.cn以后,又看不到新发的文章了。
你说奇怪不奇怪。对于登陆的用户来说,http://zhupou.cn/node和http://zhupou.cn都是首页面,里面的内容都是一样的但是对于匿名用户来说,看到的却是两回事。在前者,可以看到新发的链接,点击可以看到新发的文章,但是后者,就看不到。
我们再做做试验,把这篇文章发出去一后,看看结果。
先纠正一个错误,那就是”实验”应该改为”试验”,小时候语文不好,经常被老师批,幸好现在有了网络,遇到不明白的地方可以到网上搜搜.
前面又发了一篇文章,当我以用户g089h515r806和test用户登录后访问时,在首页,看到了刚刚发出去的两篇文章。drupal缓存(cache),和缓存试验。
现在我以匿名的什么,使用google的chrome浏览器,再次访问zhupou.cn的首页。我看到的 和前文中所截的图还是一样的。使用同样的方法,访问zhupou.cn/node,令我意外的是,我看不到刚刚发的“缓存试验”。只有drupal缓存(cache)。而登陆用户是可以看到两者的。
问题又来了,为什么匿名用户第一次访问zhupou.cn/node,能够看到最近发布的文章“drupal缓存(cache)”,当再发布一篇“缓存试验”后,再次访问zhupou.cn/node,看不到刚刚发布的“缓存试验”一文呢?这是个问题。也是初学个,经常遇到的问题,我多次看到有人问,为什么看不到新发的文章,这样的问题。
你可以按照我说的方法,对drupal缓存的设置多做一些实际的试验,用试验来了解掌握drupal缓存机制。对于使用缓存与不使用缓存的drupal性能对比实验,我就不做了,因为这是“实验”,而不是“试验”,因为我的技术层次还比较低,达不到“实验”的水准。不过可以大致的给出一个数据,那就是开启页面缓存后,性能大约有10倍左右的提升。
下面让我给大家讲解以下,drupal页面缓存的原理,这既是我从他人的经验中学习过来的,也是通过自己动手,逐步的体味出来的。我也希望,drupal的学习者,使用者,在自己用到缓存的时候,像我这样用不同的浏览器,使用不同的用户类型,不断地试验,查看结果,这样就能够更加深刻的理解drupal页面缓存的工作原理。
启用页面缓存后(普通模式),事实上在缓存中,这个页面还不存在,当有一个用户访问这个页面时,也就是页面的第一次被外界访问,这个时候还是走的完整的步骤,在页面从服务器端发送给浏览器的同时,drupal也将这个页面缓存到了drupal缓存中,这个缓存页面有个最小的生命周期,也就是最小的存活时间,在这一时期内,不管哪个用户再次访问这个页面,不管这个页面期间有没有被修改,对于匿名用户来说,返回的都是同样的内容。当过了生命周期之后,如果你启用了cron任务,系统就会帮你把这个缓存页面从drupal缓存中清除出去。只有当下次,再有用户访问这个页面时,重新生成缓存页面。对于缓存页面,只需要一条SQL语句,就可以将其从缓存表中读取出来。
如果你了解到了这一原理,就不难理解上面看到的现象,匿名用户访问zhupou.cn/node,这是因为这个路径从来没有被访问过,所以第一次,他看到了最新的内容,当再有更新时,看到的仍然是前面看到的内容。由于drupal大量的使用缓存,缓存表中的数据,会逐步地增加,所以你需要配置你的cron任务,让它帮你定期的清除过期的缓存页面,很多人会慢慢的发现,性能越来越慢,就是因为缓存表中的数据量太大了,里面的垃圾数据没有清除导致的。
6个小时以后的试验,这里就不再作了,因为今天匿名用户可以看到昨天晚上发布的内容了。我们接下来看看区块缓存,以及css,js的优化。
相关链接: Think in Drupal
我们在前面提到区块的缓存,这个也是drupal6新加的,以前没有这个配置选项的.区块的缓存,原理应该和页面一样.当我修改一个区块时,匿名用户同样看不到变化.区块与页面缓存的区别在于,区块依赖于页面.下图为站名区块中的内容.
图1
我在里面加了“测试区块缓存^_^” ,登陆用户就可以看到区块内容的变化.
图2
而匿名用户,无论访问哪个页面,我发现看到的区块内容都如图1所示.不过这些页面都是被缓存了的,包括页面中的区块.为此我专门新建了一个节点node/318,也就是论坛上的帖子“测试drupal区块缓存” .现在当匿名用户访问这个节点时,看到的区块内容如图2所示了。这个大图我就不放到这里了。事实上,匿名用户是看不到node/318这个节点外面的链接的,就是在其它页面没有这个节点的链接。这也是由于页面缓存的缘故,这里我是直接访问这个节点的,就是为了看看结果如何。
当然,如果关闭页面缓存的话,那么匿名用户是不是也就可以看到效果了?我来试试看,禁用以后,匿名用户在老的页面中看到的还是图1中的内容,访问节点node/318,看到了图2中的内容。再次修改“站名”区块中的内容,匿名用户看到的还是和原来一样。
由于区块依赖于页面,即便是关闭了区块缓存,只要页面缓存还在的话,此时修改区块中的内容,匿名用户是看不到区块中的变化的。但是对于那些在区块修改以后创建的页面,匿名用户能够访问,并且区块存在于这些页面中的话,那么匿名用户在这些页面上是能够看到区块的变化的。
这就是我通过试验,对区块缓存得出来的结论。当你启用页面缓存时,建议你同时启用区块缓存。
相关链接: http://zhupou.cn
我们在性能的配置页面,看到了CSS和JS的优化选项,我在zhupou.cn上,是将优化禁用了的,原因就是权限的问题,当我启用CSS优化的时候,就会出现没有样式的情景。如图所示:
重新启用后,出现如下错误信息:
“
The selected file /var/www/vhosts/zhupou.cn/httpdocs/tmp/fileOYB3iJ could not be copied.
The selected file /var/www/vhosts/zhupou.cn/httpdocs/tmp/file4Mi3bP could not be copied.
”
这个是由于虚拟主机上文件夹的权限问题,正是由于权限的问题,我们files和tmp两个文件夹放到了drupal的根目录下,而不是sites目录里面(子目录,或者孙目录)。但是仍然没有完全解决问题,比如这里就出了问题。
不过为了说明问题,看看我本地环境下面的zhupou网站,在本地很方便的就启用了CSS和JS优化.从页面上我们看不出任何变化,现在让我们看看页面的源文件.使用firefox打开页面,打开插件firebug,查看页面源文件。为了同时看到CSS和JS,我专门找了页面admin/content/book作为例子。下面是在firefox下面看到的。
这里面的CSS和JS文件名都很长,也不好记,这是drupal压缩而成的。在files\css和files\js文件夹下面,就可以找到上面生成的文件。这样做的最大好处就是,将多个CSS(JS)文件合并成一个CSS(JS)文件,从而减小带宽。进而减小网站的负荷。
如果禁用CSS和JS优化,同一个页面,加载的CSS和JS文件的数量就多了很多,如图所示:
注意,网站上线以后,最好能够启用这两项优化,但是在开发过程中,一定要把这两项给禁用了。开发的时候是没有多少人访问的。
除了这些配置选项以外,drupal还内置的其它缓存,比如主题缓存,菜单缓存,以及系统变量缓存,还有过滤器缓存,不过这些都是系统帮你实现的,也不需要你的配置,所以在性能的配置页面,你也就看不到这些方面的配置选项了。
如果你觉得,通过这里面的性能优化,还不能满足你的需要的话,那么你还可以对MYSQL,apache,php等进行优化,从而提高你网站的性能,但是这已经超过drupal的范围了,另外你还可以对页面缓存使用激进模式,来进一步提升性能。但对于小型网站,对于drupal的初学者来说,掌握这些简单的性能优化,就基本上可以满足实际的需要了。
相关链接: Think in Drupal