文章分类阅读
会员登录
最新评论
- 好好!一定要试试看的,其实我一 直很期待joomla整合dis cuz X1的!
作者: ultramankiki - 继承和传承,中国人喜欢,没想到 老外也喜欢。传承没有理由。我们 就当是joomla传承MAMB O,...
作者: ljoooooooo - 怎样去除Portfolio Design 的链接啊
作者: 11025 - 下载链接出错了,不能下载哦
作者: shrine - Content static静态化之后,页面上 的图片保存的是相对路径,再次浏 览的时候,就无法找到...
作者: babyfish
| Joomla SEO:用 PageCache 缓存技巧加速你的网站 | ![]() |
| 作者:白建鹏 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 2008-10-27 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
台湾人把 Cache 翻译为“快取”真是太传神了!完全符合“信、达、雅”的翻译标准。我们大陆用“缓存”来翻译,左看右看,怎么看都给人一种“慢”的感觉。我想大陆人也没有这么笨吧,于是我查了一下灵格斯翻译家里面的《英汉双解计算机词典》,原来“缓存”是“高速缓冲存储器”的简称,指“(计算机的)快速缓冲贮存区, 包含电脑很快会需要的资料的存储区”。呵呵,缓存不缓! 我的粗浅理解就是:缓存可以让电脑(服务器)更快地处理频繁使用的数据。对于 Joomla! 建站来说,你当然希望不断有人来访问你的网站,那么就等于某些相同的页面不断被浏览器向服务器发出请求来提取并展示。如果使用了缓存,服务器就可以更快速的提供这些页面,从而令前台的访客感到网站速度很快。顺便说一下,Google 这样的搜索引擎也喜欢速度快的网站。因此,想办法加快网页的打开速度对于网站 SEO 很有帮助。 本文将介绍用于 Joomla! 1.0.x 平台的一些缓存技巧。主要涉及两个组件:JRE Cache 和 PageCache 。
其实无论 Joomla! 1.0.x 还是 1.5.x 平台,核心都已经自带“缓存”选项。在“全局设置”中可以找到。这说明 Joomla! 官方对于 Cache 这个功能还是比较认可的。
为什么要用缓存功能?在过去,全静态网站是不需要缓存的。因为静态网站不涉及数据库的存取,只是对文件系统的访问。 如今动态网站成为主流。动态网站的优点是容易做到内容与外观分离,容易实现网页内容的交互性(Interactivity)。当访客在浏览器地址栏输入一个网址来访问动态网站的某个网页时,在服务器端这个指令实际上是“兵分两路”:一边从文件系统中提取框架样式,另一边从数据库中提取内容数据,最后组合成完整的页面,返回给给浏览器,就是访客所看到的样子。由于每次访客的页面请求都要产生一次数据库查询,因此加重了服务器的负担。实际上很多动态网站的内容并不是每个页面都“动态”,很多页面内容也是在一段时间之内保持相对不变。 对于这些段时间内没有变化的内容,就可以将完整页面做一个“快照”,然后作为临时文件保存在某个目录中,在短时间内,如果有访客请求同样的页面,服务器就无需向数据库发起查询,而是直接将刚才保存的“快照”拿出来给他看 —— 将原来的“兵分两路”变成了“兵合一处”。这就是缓存。这样做的好处就是加快了前台页面打开的速度。 因此,服务器端实施缓存的一般方式是“文件系统”,将页面的“快照”版本保存在缓存目录中。 手动修改过 J1.0 的 /configuration.php 文件的用户一定记得,在该文件中,专门有一项设定“缓存路径”($mosConfig_cachepath),其默认值就是根目录下的 /cache 文件夹。这就是 Joomla! 1.0 用来保存页面缓存的目录。
缓存对 Joomla! 网站有什么意义?Joomla! CMS 是一个动态内容管理系统。核心本身就带有多个组件,其中的 com_content 是管理文章的。而大多数网站都有或多或少的文章页面。不难想象,这些文章页面在发布之后,很多都不再修改。不信你回想一下你的 Joomla! 网站,那些文章页面多久更新一次?恐怕很多用 Joomla! 建的站在文章发布之后就永远不再修改了。 还有“联系”页面,除非你的联系方式变了,否则在 Joomla! 建站后谁会经常去修改“联系”页面? 同样的,“友情链接”组件的内容估计也不是频繁更新;“产品介绍”栏目的内容也不是频繁更新;“专家介绍”栏目、“会员博客”栏目等等,这些内容有可能更新,但不会很频繁。例如,可能在 24 小时内没有变化,或者 1 小时之内没有变化。 也就是说,对于一个确定在 1 小时内不会变化的页面,我们完全可以将它“缓存”59分钟。而对于一个月都不会更新的“产品介绍”栏目,我们至少可以缓存 29天!这将给服务器减少多少负担,同时给网站的打开速度加强多少!
缓存方式简介遗憾的是,Joomla! 1.0.x 默认的缓存时间是不区分范围的,只是笼统的问你“缓存多久?”。如果你网站上某些页面1小时更新一次,某些页面1天更新一次,某些页面1个月更新一次,那么你只能选择最短的缓存时间。如果你选择了比较长的缓存时间,例如缓存 5 小时,那么更新较快的页面在有了新内容之后,前台仍然不会体现出来。 如果你的网站上还有一个更新特别频繁的区域,例如:论坛。那么很可能每 2 分钟就有一个新的帖子出现。如果将缓存时间设置为 1 分钟甚至更短,那就失去了缓存的意义。而对于你网站上另一些更新并不频繁的页面来说,不能拥有较长的缓存时间也很遗憾。 还有一个更复杂的情形就是:在很多网站上,文章系统带有“访客评论”功能。文章本身可能很久都不再更新,但是评论内容可能每天都有新的内容产生。这两者同时显示在同一个页面上,又该如何选择缓存的模式? 曾经有会员专门在我们论坛推荐过 一款全静态插件 Content Static,但该插件也不能区分哪些页面需要转为静态,哪些必须时时刻刻提取最新版本。 因此,我们对于理想的缓存方式的期望是:能够区别对待网站上更新频率不同的区域。 另外,必须了解一点就是,除了文件系统这种缓存方式,还有数据库的缓存方式。后者就是将网页快照存放在数据库,当服务器端接收到浏览器的请求,就直接从数据库中取出快照传输过去,无需再到文件夹里面提取样式框架。这两者哪一种效果好?这取决于具体的服务器环境。如果服务器上数据库比较繁忙,那么用文件系统做缓存当然效果好;反之,就应该选择数据库作为缓存位置。 近年来,随着内存芯片价格不断下降,过去昂贵的带 ECC 校验的服务器内存也便宜了许多。因此很多服务器都开始拥有 4GB 甚至更大内存。基于内存的缓存方式也逐渐兴起。无论“文件系统”还是“数据库”,其实都是存放在硬盘上的;而内存就不同了,大家都知道,内存的读取速度与硬盘不可同日而语!因此,如果有条件选择基于内存的缓存方式,那当然最好! 可是,正如你所看到的,Joomla! 只提供了“文件夹缓存”这么一种途径,也不能区别对待不同的内容区域。因此,其缓存机制实在太有限了! 这就引出了我们今天要介绍的两个工具 ——
{mospagebreak_scroll title=JRE Cache 与 PageCache 的简单介绍&heading=Joomla! 缓存的方式及意义} JRE Cache 与 PageCache 的简单介绍
JRE Cache 与 PageCache 是目前我能找到的两个专门针对“缓存”功能来增强 Joomla! 系统性能的组件。首先请看下表的简单比较:
这两个软件我都简单测试过,上表中之所以有 JSMF 一项,是因为我当时是为了给我的网站挑选“加速器”,而本站正是采 用 JSMF 整合了 SMF 论坛。但是在 JRE Cache 官方网站看到,有很多人跟我一样安装了 JSMF,然后再安装 JRE Cache 就会导致 JSMF 桥接器无法工作。该组件作者在论坛都是针对每一个用户来手动帮助修改代码,实现对 JSMF 的兼容。而 PageCache 就没有这个问题,原生支持。 JRE Cache 似乎还有一个问题,就是很多人报告它与 VirtueMart 网上商店组件也有冲突。本站会员就曾经在 Joomla! 中文论坛报告过同样的问题。 PageCache 的中文界面是我汉化的。本来也想汉化 JRE Cache,可惜该作者没有提供语言文件,只好作罢。 看完上面这个表,我想我认为 PageCache 应该更胜一筹。尤其是它支持基于内存的缓存方式,这一点很前卫! 尽管 JRE Cache 也有针对 Joomla! 1.5.x 的版本,但是我认为意义可能不大了。因为据 PageCache 在回答“PageCache 什么时候支持 J1.5 ”这样的问题时说,他已经在 Joomla! 1.6 核心中大幅改进了缓存机制(貌似作者 Ircmaxell 是 Joomla! 官方开发团队成员啊),因此不需要专门开发第三方组件了。 既然 Joomla! 1.6 快来了,J1.0 又快过时了,我写这个文章还有什么意义呢? 我认为可能还存在少数 Joomla! 1.0.x 用户,并且他们没有升级的愿望。那么,对这部分用户来说,就可以采用缓存技术加速网站。另外,我想我们可以在欣赏这些优秀软件同时,获取一些灵感,对于以后开发类似的 web 程序可以积累一些经验。 由于这些缓存增强组件需要凌驾(override)Joomla! 自带的缓存机制,因此它们的安装过程都会自动修改核心文件代码,如果你将来不需要它们了,在卸载时又会自动还原核心文件。而且这两个组件都在后台参数中有“还原文件”的按钮,方便随时取消功能。这就是上表中所说的“暂停缓存”。 既然 JRE Cache 又收费又不好用,我们下面简单说说 PageCache 的使用。
{mospagebreak_scroll title=PageCache 缓存组件的启用}
PageCache 缓存组件的启用
PageCache 的安装过程跟安装其它组件一样,安装结束后并未生效,需要到其后台的“设置”页面启用。后台控制面板如下图所示:
点击“设置”就能看到如下画面:
第一项参数就是是否启用。如果你想享用 PageCache 的加速功能,当然需要勾选启用。第二项参数是缓存时间,单位是秒。你必须根据网站上更新较频繁的区域来设定这个数值,例如:留言本可能每天四、五次,文章系统好几天才更新,那么就可以设置缓存时间为 2小时 —— 7200 秒,填写 7200 即可;最频繁的就不必考虑了,例如论坛,我们后面要解释如何排除对论坛的缓存。像某些小企业网站,所有页面都不需要经常更新的,完全可以将缓存时间设置为 24 小时,即 86400 秒。 请注意上图中“缓存方式”部分,Database 、Eaccelerator 和 File 三项是正常文字样式,表示当前可用,而 APC、MemCache 和那个没有需要向下滚动才能看到的 Xcache 以斜体字出现,表示当前不可用。这是因为我是 用 XAMPP 搭建了本地 Joomla! 测试服务器,没有这三项功能,因此不可用。 设定好参数后,点击右上角的“保存”按钮即可生效。
{mospagebreak_scroll title=在 PageCache 中除外对指定组件的缓存}
在 PageCache 中除外对指定组件的缓存
我想你现在已经明白了,网站上哪些页面需要缓存,哪些不需要缓存。简单说,就是更新频繁的不要缓存,长期不更新的就缓存。 PageCache 有一个很好的功能就是允许除外对指定组件的缓存。例如,它已经内置了一个参数,指定不要缓存 FireBoard 论坛组件,这样的话,所有论坛的内容都不会缓存,访客就能及时看到当前最新的帖子。 如果你的论坛不是 FireBoard 呢?那么,我们就必须手动添加这个除外规则了。 从 PageCache 的控制面板上点击“模块”(此处模块的概念与 Joomla! 的模块概念不同),可以看到其中有 no cache 模块,就是设定“不要缓存”的内容的。
这里有两种“不缓存”设定方式,一个是 no_cache_database,一个是 no_cache_file,你随便选择一个都可以,只要记着设置完后要发布你所选择的模块。例如上图中,前者是发布状态,而后者是未发布状态。 我当时选择了 no_cache_file,点击进入后,可以看到作者已经预设了对几个常见组件的“缓存除外”机制:
从上图可以看出,com_fireboard 和 com_joomlaboard 都是论坛,因此不能缓存;com_jomcomment 指 JomComment 文章评论组件,也不能缓存,因为随时都有可能收到新的评论;com_registration 是注册组件,因为随时都可能有人来注册,因此不能缓存;registers 是 Community Builder 的注册程序;rss 是新闻供稿,也不需缓存。 假设我们所用的论坛是 SMF,桥接器是 JSMF,那么实际上访问论坛的网址中,组件部分是 com_smf(你可以从论坛的 URL 中看出)。因此,我们现在照猫画虎,来手动添加对 JSMF 所整合的论坛的“缓存除外”: 点击右上角的“新建”,就看到如下的界面:
上图是我填写的示范。com_smf 这里一定不能弄错,这是关键!假如你的论坛是 Agora 组件,那么就填写 com_agora —— 注意,连大小写都不能错。如果你不清楚某个组件的正式名称,有两个方法查到:一个是看 URL,一个是到安装目录的 /components 文件夹里面,找到那个组件对应的子目录,其目录名称就是有填写的内容。 填写完成后,点击右上角“保存”按钮,就回到了模块列表画面。确认刚才编辑的模块已被发布。那么从现在起,你所指定的那个组件将不再被缓存。 之所以花这多长篇幅介绍这个办法,是因为我测试时发现,如果你将某个频繁更新的区域纳入了缓存范围,则前台偶尔出现页面布局被搞乱的局面。因此,一定要好好考虑,把所有频繁更新内容的组件都添加到 nocache 列表中去。 一般来说,文章页面很少更新。但是阅读全文的时候,页面两侧可能有“论坛新帖”或“最新评论”这样的模块。这些模块不属于任何组件管理,无法用上述方法除外。但是它们的内容也是随时更新的。如何将模块排除在 PageCache 的缓存范围之外?请看下节 ——
{mospagebreak_scroll title=PageCache 官方 FAQ 摘录} PageCache 官方 FAQ 摘录
PageCache 的官方 FAQ 栏目解答了很多很有价值的问题。我将其中大部分翻译并摘录于此。通过学习这些 FAQ,我们可以领略一些软件设计方面的思路。 1、如何移除页面底部的“Powered by...”PageCache 作者说,这是一个开源软件,作者可以允许用户删除在前台显示的“Powered by...”字样,有两种途径:一种是向作者捐款20美元,同时提供你安装 PageCache 网站的 URL,然后作者送你一个授权码(license code),你从 PageCach 后台输入就能自动取消显示这个版权标记;另一种就是自己动手,从源代码中删除。 考虑到大部分中文 Joomla! 用户还不熟悉从源代码中寻找版权标记的方法,因此我介绍一下手动删除的方法: 打开 /components/com_pagecache/pagecache.class.php 文件,在大约第 116 行,找到如下代码: $replace = "<div class='bottom_page' style='text-align:center;'>Powered By <a href='http://www.joomlaperformance.com' title='Powered by PageCache'>PageCache</a></div></body>";
然后在该行之前,就是 $replace 前面加上双斜线(//),变成 //$replace ,就表示注释掉(comment out)该行代码,不再生效。 当然,如果你的网站是盈利性质的,我建议你在方便的时候还是给作者一些捐款,人家开发这个软件花费了多少心血啊! |
下载 Auto Purge Cache Plugin for J1.5 自动清理缓存插件 v1.2 多国语言版 | ||||||||||
| ||||||||||
{mospagebreak_scroll title=白建鹏对 Joomla! 缓存机制的几点看法}
白建鹏对 Joomla! 缓存机制的几点看法
有些人说,现在服务器性能好多了,没有必要用缓存。我不这么想。当年我们用 56K Modem 上网的时候,163 邮局也是可以打开的。现在你试试看,还能那么顺畅吗?这是因为在服务器升级的同时,网站建设技术也在不断升级,网页内容也在不断丰富。以前网上传输音频是不可想像的,现在视频都有了,而且在向“高清”迈进。因此,仍然有必要采取“缓存”机制来加速网站的速度,尤其对于内容不怎么更新的网站。别忘了,在文章开头我就说过,网站速度快了,对于 SEO 也是有帮助的。
对于 Joomla! 这个具体的 CMS 系统来说,我认为缓存的实施比其它建站技术更方便。这得感谢 Joomla! 的“模块化”设计思路。在 PageCache 中我们已经看到,可以针对特定的组件来决定是否对其内容进行缓存。
鉴于 Joomla! 建站后网站内容基本上由组件、模块、插件和桥接器组成,我就从这几个方面谈谈我对 Joomla! 网站实施缓存的看法。
基本观点:缓存必须区别对待更新周期不同的内容;操作方法必须容易理解(用时髦的话讲,就是学习曲线不要那么困难)。
对于 Joomla! 组件缓存的想法
PageCache 已经能允许除外任何一个组件,这是一种非常好的思路。我唯一想补充的是,操作方法不方便。手动添加诸如 com_weblinks 这样的代码到 no_cache_file 列表很容易出错。
因此,我的建议是,将这个功能再改进一下,更人性化一些。做成“点击选择”模式,如下图所示:
已安装组件 |
添加 ==>>
<<== 移除
| 不需要缓存的组件 |
com_content com_chronocomments com_fireboard com_remository com_contact com_rsgallery2 com_weblinks |
这样做的好处是:用户不需要手动输入什么,只需要选择即可。这样就避免了用户手动输入而出错的机会。
顺便说一下:白某对于软件设计者一个基本的忠告就是“请把软件做得更容易一些”,我经常在批评某些 Joomla! 扩展开发者的思路时说:“Please make life easier!”。不管你这个软件将来免费还是收费,作为一个敬业的程序员,努力让用户更容易学会操作,努力降低用户出错的机会,这是你的职责!
对于 Joomla! 模块缓存的想法
某些 Joomla! 模块已经自带缓存功能,例如在 Joomla! 1.0.x 平台上,你看看“主菜单”这个模块的参数,里面就有“缓存”的选项。因为菜单对于一个网站来说,恐怕几年都不会变。因此,将菜单模块缓存30天甚至30年都可以。
但是,还有很多模块作者没有考虑到这一点。因此需要开发类似 PageCache 高级缓存管理组件的作者把这个功能做好。
前面提到,PageCache 作者要求用户修改模板文件来实现对模块的“缓存除外”。我看了这个方法之后,感觉作者犯了一个错。且不说手动修改模板文件对于很多人来说很不方便,单单是针对模块位置的处置规则就有错。因为在 right 这个模块位置上,用户可能发布了多个模块,例如“文章类别列表”,不见得发布到这个位置的所有模块都不需要缓存。假如该位置有8个模块,用户只需要“论坛新帖”被排除,那么这个方法明显杀伤面积太大了。
我在 PageCache 的官方论坛提出一个建议:作者完全可以在 PageCache 的后台参数中增加一项“除外下列模块”,然后用户可以输入不需要缓存的模块的 ID 来实现每次都提取该模块的新内容。由于 Joomla! 中的每一个模块其 ID 都是唯一的,因此这个方法不会妨碍其他需要缓存的模块。同时,如果用户有多个模块需要排除,例如:还有“最新评论”也是动态的,“最新留言”也是动态的,那么,可以通过“逗号分隔”的方式输入多个 ID。
对于 Joomla! 插件缓存的想法
有一些插件的内容是可以缓存的,例如在文章中用 Allvideos Plugin 插件插入的视频,该内容不是天天变,因此可以缓存;有一些插件的内容不能缓存,例如 AJAX Vote 文章评分插件,任何只要在任何时候点击一下评分的红星,该插件要表达的“值”就变了,因此不能缓存。
但是,在 PageCache 中还没有考虑到对插件的处理。我考虑了一下,对插件的缓存处理确实比较困难。但我相信,对于专业的 php 编程人员来说,这或许也是一个困难,但不是无法解决的困难,只是时间问题而已。
对于 Joomla! 整合外部内容缓存的想法
Joomla! 的功能还没有强大到不需要任何外部程序来补充的地步。例如论坛功能,目前任何一个 Joomla! 的论坛组件都无法与 phpBB3 或者 SMF2 来媲美。因此,当我们整合了这些外部程序以后,Joomla! 该如何处理这些内容的缓存方式?
我的看法是,如果要整合,一定要将桥接器做成组件形式,一定要让该外部程序的所有数据流都通过桥接器与 Joomla! 沟通。这样,Joomla! 就可以通过对桥接器组件的控制实现对所整合的外部程序的控制。
当然了,创建指向外部程序的菜单时,也最好是用桥接器组件来创建菜单,通过桥接器组件将外部程序嵌入整合(wrapped in)在 Joomla! 的框架之内,这样既美观,又方便 Joomla! 对外部程序的控制。
顺便说一下:当初 JFusion 多功能桥接器的作者死活不同意我的这个看法,他顽固地认为,外部论坛不需要用“嵌入整合”模式,因为那样降低了速度。当时我们争论很激烈,差点就要骂起来了。但是,最近发布的 JFusion 1.0.8 版本中,作者主动增加了对 SMF 论坛和 phpBB 论坛的“无缝整合”(Frameless)模式,实际上跟我去年给他的建议是一样的。这说明什么?说明用户需要这种整合模式,你不做这个功能,我就不用你这个软件!
最后总结一下,虽然说 PageCache 不能在 Joomla! 1.5.x 上面安装,但是我觉得仍然有必要探讨这个话题。因为我们从中可以学习一些思路。
我想再次提醒某些程序员:你的 php 编程技术或许一级棒,但是如果没有正确思想的指引,你只能开发结构优秀、没有 bug 的垃圾,而绝不是实用的软件。JFusion 的作者为什么增加“嵌入整合”模式?因为他终于认识到去年他的观点是错误的!
我相信国内这样的自以为是的程序员不在少数。如果你能认真听取一下用户的意见,首先解决好“软件设计思路”的问题,然后再开始写代码,我相信你一定会成为受欢迎的软件作者。
希望我们中国的 php 程序员能设计出更好的 Joomla! 扩展来。谢谢!
下载 Auto Purge Cache Plugin for J1.5 自动清理缓存插件 v1.2 多国语言版 | ||||||||||
| ||||||||||
| < 上页 | 下页 > |
|---|




下载 Auto Purge Cache Plugin for J1.5 自动清理缓存插件 v1.2 多国语言版




