龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

《PHP与MySQL程序设计(第3版)》――19.8 缓存

时间:2009-12-17 12:00来源:未知 作者:admin 点击:
分享到:
功能强大的应用程序一般都有很大的开销,通常是数据获取和处理操作带来的。对于Web应用程序,这个问题是由于HTTP协议的无状态性造成的。由于HTTP协议是无状态的,对于每个页面请

功能强大的应用程序一般都有很大的开销,通常是数据获取和处理操作带来的。对于Web应用程序,这个问题是由于HTTP协议的无状态性造成的。由于HTTP协议是无状态的,对于每个页面请求,都要重复地执行相同的操作,而不论数据是否修改。要让应用程序在世界范围最大的网络中可用,会使这个问题进一步恶化。所以,毫不奇怪,人们总在想方设法地让Web应用程序运行得更高效。对此有一种特别有效的解决方案,这也是最合理的方案之一:将动态页面转换为静态页面,只有在页面内容有修改后才重新构建,或者定期地重新构建。Smarty提供了这样一个特性,一般称为页面缓存(page caching)。本节将介绍这个特性,并提供几个使用示例。

注解 “缓存”与“编译”在两个方面有所不同。首先,虽然“编译”通过将模板转换为PHP脚本而减少了开销,但仍要在逻辑层执行获取数据所需的动作。“缓存”则在这两个层次上都减少了开销,不再需要在逻辑层反复地执行命令,另外还将模板内容转换为静态页面。其次,“编译”在默认情况下是启用的,而“缓存”必须由开发人员显式开启。

如果要使用缓存,需要首先通过设置Smarty的缓存属性来启用缓存,如下:

启用缓存后,调用display()和fetch()方法在指定模板(由$cache_dir属性指定)中保存目标模板的内容。

19.8.1 处理缓存生命期

缓存的页面在由$cache_lifetime属性指定的生命期(以秒为单位)内有效,默认为3600秒,即1小时。因此,如果希望修改此设置,就可以设置这个属性,如下:

在此对象的生命期内,后续调用和缓存的模板都使用此生命期。

有可能需要覆盖以前设置的缓存生命期,从而能分别控制每个模板的缓存生命期。通过将$caching属性设置为2就可以做到这一点,如下:

在这里,news.tpl模板的生命期设置为20分钟,它覆盖了前面设置的全局生命期值。

19.8.2 通过is_cached()消除处理开销

如本章前面所述,缓存模板还能消除处理开销,如果禁用缓存(只启用编译),这些处理开销总是会发生。但是,默认情况下并没有启用缓存。要启用缓存,需要把处理指令放在if条件中,并执行is_cached()方法,如下:

在这个例子中,将首先验证模板news.tpl是否有效。如果有效,则跳过数据库访问,否则执行数据库访问。

19.8.3 为每个模板创建多个缓存

任何指定的Smarty模板都可以用于为整个系列教程、新闻项、博客项等提供一个通用界面。由于同一个模板用来生成不同数量的不同项,那么如何缓存一个模板的多个实例呢?答案比你想象的要简单。Smarty的开发人员实际上已经解决了这个问题,可以通过display()方法为缓存模板的每个实例指派一个唯一标识符。例如,假设有一个用于生成专业拳击手传记的模板,并希望缓存这个模板的各个实例:

特别要注意下面一行:

这一行对于此脚本有两个功能,一方面获取名为$_GET["boxerid"]的boxerbio.tpl缓存版本,另一方面,如果还不存在这个缓存,则用这个名字来缓存该模板实例。采用这种方式,可以轻松地为指定模板缓存任意数量的实例。

19.8.4 关于缓存的结束语

模板缓存大大提升了应用程序的性能,如果决定将Smarty集成到工程中来,就应当认真地考虑缓存。但是,因为大多数强大的Web应用程序功能都体现在其动态特性上,所以一方面要考虑到性能提升,另一方面也要考虑到缓存页面随时间是否仍有效,要在这二者之间进行权衡。通过本小节的学习,你了解了如何分别管理每个页面的缓存生命期,以及基于特定缓存的有效性来执行逻辑层的某些部分。要确保对每个模板都考虑到这些特性。

精彩图集

赞助商链接