EZ Publish/EZ Publish 视图缓存
EZ Publish | EZ Publish安装与卸载 | EZ Publish的使用 | EZ Publish常见问题 | EZ Publish其他 |
EZ Publish 视图缓存简介[ ]
缓存是一种广泛使用的技术,它将经常使用的信息保留在临时的高速存储介质中来提高系统的性能。当原始数据的提取或计算/生成相对于存取缓存所需的系统开销很大(通常指访问时间)时,缓存的效用会非常明显。一旦数据被保存在缓存中,之后可以直接从缓存中提取而不需要重新从系统中提取或重新计算原始数据,因此平均访问时间会比较低。
eZ Publish 内建了功能强大的缓存机制,它可以改善系统的性能。本条目阐述了eZ Publish 缓存系统的重要部分,这部分被成为“内容视图缓存”(简称“视图缓存”)。这种机制只对content 模块的"view"和"pdf"视图有效。
节点视图缓存
这节描述了当节点被访问时,视图缓存是如何被生成的。
当eZ Publish 被请求输出关于一个节点的信息时(通过系统URL 或虚拟URL),它会执行与"content"模块的"view"视图相关的程序代码。执行结束后,视图将结果返回给模块,模块负责将结果返回给系统的其余部分。eZ Publish 会自动生成一个称为"module_result"的数组,它包含包含了以下信息:运行的哪个模块,执行的哪个视图,视图的输出结果等等。视图的实际输出内容(例如:通过某个节点模板生成的XHTML 代码)被设置为"$module_result.content"并且通过以下代码在pagelayout 中显示:
{$module_result.content}
当pagelayout 被生成时,{$module_result.content}部分会被实际的输出替换。如果视图缓存被启用,模块的完整结果会被缓存。这意味着"module_result"变量的内容会被存入"var/example/cache/content"目录("example"由"site.ini"重设文件中的"VarDir"设置)中的一个缓存文件。
请注意,eZ Publish 会根据角色和用户偏好设置为一个节点创建多个视图缓存。这意味着,例如:对于不同用户(已经登录,且具有不同的权限/偏好设置)会被提供不同的缓存,而匿名用户或有相同权限和用户偏好设置的会被分别提供相同的缓存。换言之,当启用视图缓存时,"content"模块的"view"视图只有在系统不能定位一个缓存文件才会被执行,否则缓存的内容会被直接嵌入pagelayout。请注意pagelayout默认情况下不会被缓存。
另外一个需要注意的问题是,视图缓存还依赖其它参数。例如:
• 视图模式
• 语言
• URL 中的视图参数
• Layout(例如:'print' layout 会使用不同的缓存文件)
• 其它
例
假设节点46 对应“关于我们”页面并且自定义的模板"aboutpage.tpl"对这个特殊节点重设了默认的"node/view/full.tpl"。
现在虚拟URL "http://www.mysite.com/company/about"和系统URL“http://www.mysite.com/content/view/full/46”都指向这个页面。当访问它们中的某个URL 时,系统会执行"content"模块的"view"视图并使用"46"作为节点ID,"full"作为视图模式。包含“关于我们”信息的XHTML 结果会由"aboutpage.tpl“生成。输出会被设置到"$module_result.content"并随后被嵌入pagelayout 中。
如果视图缓存对"full"视图模式启用,模块的完整内容会被报存在一个缓存文件。每个缓存文件有一个类似于"46-122bc591bf62e87a4e9ddcb5ba352bc4.cache"的很长的文件名。下一次访问关于我们页面时,系统不会执行"content"模块的"view"视图,而是会直接从缓存文件中装载内容。
$node 变量
在eZ Publish 3.9 之前的版本中,在启用视图缓存被禁用时,"$node"变量可以在pagelayout 中使用。从3.9 版本开始,无论是否启用视图缓存,这一变量在pagelayout 中都不再可用。如果仍然需要访问当前节点,建议从$module_result 中取得需要的信息(例如:"$module_result.node_id"代表当前节点的ID)。
PDF 缓存
以下解释了当访问某个站点页面(内容节点)的PDF 版本时,视图缓存是如何生成的。注意,在eZ Publish4.0 中PDF 导出机制已经不再推荐使用并且会被从将来的发行版本中剔除。当eZ Publish 被请求生成一个节点的PDF 版本时,它会执行"content"模块的"pdf"视图对应的程序代码。系统会使用"pdf.tpl"提取实际的页面内容(节点封装的对象中的属性内容),然后使用"execute_pdf.tpl"生成PDF 文件。与节点视图缓存不同,系统不会把输出内容嵌入$module_result.content。这些默认的模板位于"standard"界面中的"templates/node/view"子目录。
如果为"pdf"视图启用缓存,PDF 文件会被缓存。这意味着系统会将实际PDF 的一份副本保存为"var/example/cache/content"("example"可以在"site.ini"重设文件中的"VarDir"设置)中的一个缓存文件。
例 如果节点46 是“关于我们”页面,则访问"http://www.mysite.com/content/pdf/46"会执行"content"模块的"pdf"视图。系统会生成关于我们页面的PDF 版本并将它显示给用户。如果为"pdf"视图启用视图缓存,结果PDF 文档会被缓存在一个文件中,例如"46-3579d18de31e99fc84d2d9a5f113c3be.cache"。请注意,这个文件可以用PDF 阅读器打开(某些情况下,需要将文件扩展名改为".pdf")。
配置视图缓存[ ]
视图缓存机制默认被启用。但是,可能希望在网站开发阶段将它禁用(否则对节点模板做的改动每次必须清除缓存才能生效)。可以在"site.ini"重设文件中的"[ContentSettings]"下添加以下内容来禁用视图缓存:
ViewCaching=disabled
注意,建议在开发完成之后重新启用视图缓存。这可以通过将"disabled"变为"enabled"来完成:
ViewCaching=enabled
"site.ini"中"[ContentSettings]"章节下的"CachedViewModes"配置控制为哪些视图或视图模式启用视图缓存。
默认值为"full","sitemap"视图模式和"pdf"视图:
CachedViewModes=full;sitemap;pdf
但是,注意"pdf"视图已经不推荐使用。
如果需要为一个特定的模板禁用缓存,在这个模板的第一行加入如下内容:
{set-block scope=global variable=cache_ttl}0{/set-block}
这会在当前模板内将全局变量"cache_ttl"设置为0。"cache_ttl"变量包含以秒为单位的TTL(Time To Live)。TTL 为0 意味着结果不应该被缓存。TTL 为"-1"意味着缓存永远都不应该过期,参阅下例:
{set-block scope=global variable=cache_ttl}-1{/set-block}
角色 不同角色组合会使用不同的缓存文件。这意味着,尽管视图缓存被启用,模板中仍然可以存在基于角色的条件分支。
用户偏好设置
以下文字描述了如何处理用户偏好设置以及当前用户的偏好设置如何影响内容视图缓存的生成。
例如,任何时候如果用户通过管理界面执行以下操作:
• 启用/禁用收藏夹菜单
• 调整内容树的宽度(小/中/大)
• 选择子项目窗口的视图模式(列表/缩略图/详细)或每页的项目数(10/25/50)
• 改变不同窗口的可见性(预览/详细/翻译/位置/关联)
...或设置任何其它偏好设置,系统会执行"user"模块的"preferences"视图来保存这些选项。选择的偏好设置通过视图参数传递: .../user/preferences/set/<name_of_preference>/<value>
例如
http://my.com/myadmin/user/preferences/set/admin_left_menu_width/medium
保存选择的值之后,"user"模块的"preferences"视图会重定向到上一次访问的页面。如果被缓存的模板中有基于用户偏好设置的条件分支,应该指定哪些偏好组合会与不同的视图模式一起使用。这可以在"site.ini.append.php"中的"[ContentSettings]"节下的"CachedViewPreferences"设置。
例
假设商品使用多种货币,并且对所有商品"node/view/full.tpl"已经被重设,因而可以用用户优先货币显示商品的价格。如果为"full"视图模式启用视图缓存,系统会为商品显示模板创建缓存。如果缓存忽略优先货币,当选择另外一个优先货币时,系统会返回刚才缓存的内容(换言之,货币以及价格不会改变)。
为了避免这种情况,需要在"CachedViewPreferences[]"数组中用"full"作为键值,并在在数组中添加"user_preferred_currentcy"。要修改这个设置,编辑"site.ini"重设文件。如果"[ContentSettings]"章节下已经有如下设置:
CachedViewPreferences[full]=<list_of_user_preferences>
那么应该在这一行的行尾追加一个":"和"user_preferred_currency"。例如:
CachedViewPreferences[full]=admin_navigation_content=0; admin_navigation_details=0;<...>;admin_bookmarkmenu=1; admin_left_menu_width=13;user_preferred_currency=''
注意,这一行通常会很长。在本例中我们用<...>代替了中间部分。
如果"[ContentSettings]"章节下没有这一行,则可以直接添加:
CachedViewPreferences[full]=user_preferred_currency=
关联站点入口
"site.ini"重设文件中的"[SiteAccessSettings]"节下的"RelatedSiteAccessList"设置控制当前站点入口的视图缓存被清除后,还有哪些站点入口的视图缓存应该被清除。(这需要所有关联的站点入口使用相同的"VarDir")。如果没有指定"RelatedSiteAccessList",系统会使用"AvailableSiteAccessList"。
注意,从eZ Publish 3.8 版本开始,缓存系统不再使用"content.ini"重设文件中"[VersionView]"节下的"AvailableSiteDesignList"。在3.7 版本以前,它可以包含一组界面,它们会在缓存清除之后被更新。
清除视图缓存[ ]
当一个对象的一个新版本(也包括第一个版本)被发布时,系统会自动清除以下项目的视图缓存。
• 所有指派给这个对象的已经发布的节点
• 父节点
• 与这个对象有相同关键字(如果至少有一个关键字类型的属性)的对象的节点。
此外,以下节点的视图缓存也会被清除:
• 一般类型关联和一般类型逆向关联的对象的节点
• "XML 嵌入"类型的逆向关联对象的节点
这是由"ClearRelationTypes"配置决定的。
这种默认行为可以通过配置“智能视图缓存清除系统”来扩展。
注意,清除某个站点入口内的节点的视图缓存,也会清除相同节点在所有相关站点入口内的缓存。
使用管理界面
管理界面可以用来清除当前查看的节点的视图缓存:
1. 导航到希望为其清除缓存的节点。换言之,确保目标节点正在被显示。
2. 在预览窗口的标题栏中,点击表示节点类型的图标(鼠标左键)并从上下文菜单中选择“清除视图缓存”。
如下图:
也可以选择“在此”清除整个子树的视图缓存(包括当前节点)。
使用脚本
可以通过在eZ Publish 根目录中执行"bin/php/ezcontentcache.php"脚本来清除特定节点或子树的视图缓存。
下例演示了具体步骤。
例1
假设节点46 为“关于我们”页面([[1]])并且您对这个节点的自定义模板做了修改。如果启用了视图缓存,除非您清除节点46 的视图缓存,否则您的修改不会生效:
1. 进入eZ Publish 根目录
2. 用以下命令行执行脚本
./bin/php/ezcontentcache.php --clear-node=46 或 ./bin/php/ezcontentcache.php --clear-node=/company/about
这会清除节点46(以及同一个对象的其它位置),它们的父节点,有相同关键字的对象节点,“一般”类型的关联和逆向关联对象节点以及“XML 嵌入”类型的逆向关联对象节点的视图缓存。如果您需要清除多个节点的视图缓存,用逗号","分隔它们的节点ID 或者虚拟URL:
./bin/php/ezcontentcache.php --clear-node=46,59,63
这个脚本会清除所有指定节点对应的视图缓存。
例2
假设节点72 为公司新闻文件夹([[2]]),它包含很多新闻文章。要清除这个文件夹以及子孙节点的视图缓存,参阅如下步骤:
1. 进入eZ Publish 根目录
2. 运行以下命令行:
./bin/php/ezcontentcache.php --clear-subtree=72 或 ./bin/php/ezcontentcache.php --clear-subtree=/company/news
如果您需要清除多个子树,用逗号","分隔它们的虚拟URL(或节点ID):
./bin/php/ezcontentcache.php --clear-subtree=/company/news,/partners
视图缓存智能清除[ ]
智能视图缓存清除系统(在本章中简称"svcs"),允许您设置自定义的规则来控制当对象被发布时,哪些节点的视图缓存应该被清除。这个特性默认被禁用,因此当某个对象被发布时,系统只会清除以下节点的视图缓存:
• 这个对象的所有被发布的节点
• 父节点
• 与这个对象有相同关键字的对象节点(如果至少有一个关键字类型的属性)
此外,以下节点的视图缓存也会被清除:
• “一般”类型的关联和逆向关联对象节点
• “XML 嵌入”类型的逆向关联对象节点
这是由"ClearRelationType"控制的。
如果希望启用智能视图缓存清除系统,确保"viewcache.ini"重设文件中包含以下内容:
[ViewCacheSettings] SmartCacheClear=enabled
以上配置会要求系统在默认缓存清除规则的基础上,根据这个文件中的规则清除其它节点的视图缓存。这个配置文件通常包含一个通用配置"[ViewCacheSettings]"和多个特殊的章节,这些章节定义了哪些附加节点的视图缓存应该被清除。
注意:这些附加节点的视图缓存也会根据svcs 规则被清除(参阅例5)。
这些特殊的配置章节由类标识符命名。
当一个已发布的对象被修改时,svcs 将对象的类标识符作为一个输入参数。它会检查这个对象的类标识符并在"viewcache.ini"重设文件中找与类标识符相同的章节。在匹配到的章节下定义的规则会应用到这个节点的所有祖先节点(在节点的"path_string"中列出的节点)。如果发布的对象有多个节点/位置,svcs会对它们逐个处理。以下的列表揭示了svcs 如何处理发布对象的每个节点:
1. 自下向上扫描节点"path_string"中的祖先节点(扫描的最大数由"MaxParents"配置指定)
2. 对每个祖先节点执行以下操作:
• 检查节点的类标识符
• 如果标识符在"DependentClassIdentifier[]"数组中,将这个祖先节点加入到“附加节点”中
3. 如果"ObjectFilter[]"配置为空,清除附加节点的视图缓存。否则,检查附加节点的类标识符,然后之清除那些类标识符在"ObjectFilter[]"数组中列出的节点的视图缓存。在两种情况下,缓存都会通过"ClearCacheMethod[]"中定义的方法来清除。
从eZ Publish 3.9 版本开始,当特定类型的对象被修改时,还可以清除一组特定对象的视图缓存。如果"AdditionalObjectIDs[]"数组包含一组对象ID(不是节点ID),系统会清除这些对象所有位置(节点)的视图缓存,不论这些节点是否是被发布的对象节点的祖先节点。
下表详细解释了以上讨论过的各种配置。
例1
假设对如下的内容结构,视图缓存与svcs 都被启用:
如果不指定任何svcs 规则,修改一篇文章会导致如下节点的视图被清除(默认的svcs 行为):
• 它所有发布的节点
• 他们的父节点
• 包含相同关键字的对象节点的视图缓存
• “一般”类型的关联和逆向关联对象节点的视图缓存
• “XML 嵌入”类型的关联对象节点的视图缓存。
如果"article2"对象只有一个位置,不包含关键字且不与任何其它对象关联,那么修改它会清除文章本身以及"News"文件夹的视图缓存。"About"和"Company"节点的视图缓存不会被清除。
但是,可以通过在管理站点入口(例:admin)的"viewcache.ini.append.php“中添加如下配置来扩展系统的默认行为:
[article] DependentClassIdentifier[] DependentClassIdentifier[]=folder ClearCacheMethod[] ClearCacheMethod[]=object
现在,如果一篇文章被修改,系统会根据它的"path_string"从下向上依次提取它的祖先节点("article2"的"path_string"为"/77/78/80/82/"),检查它们中哪些是文件夹节点,并清除这些文件夹节点的视图缓存。这意味着修改"article2"会导致清除"article2","News","About","Company"以及所有位于"Company"节点之上的祖先节点的视图缓存。
例2
您可以限制提取祖先节点的深度:
[article] DependentClassIdentifier[] DependentClassIdentifier[]=folder ClearCacheMethod[] ClearCacheMethod[]=object MaxParents=2
这会要求系统只处理节点的最下两级祖先节点。这意味着修改"article2"会导致"article2","News"和"About"节点的视图缓存被清除。"Company"节点的视图缓存不会被删除。
例3
您可以用"ObjectFilter[]"数组来指定一组对象ID,从而在"path_string"中列出的所有文件夹祖先节点中,只有那些对象ID 在"ObjectFilter[]"中列出的节点的视图缓存才会被清除。
ObjectFilter[] ObjectFilter[]=<object_id1> ObjectFilter[]=<object_id2> ...
假设在例1 中的"Company"对象ID 为74(它的节点ID 为77),您可以在管理站点入口(例:admin)的"viewcache.ini.append.php"中指定如下设置:
[article] DependentClassIdentifier[] DependentClassIdentifier[]=folder ClearCacheMethod[] ClearCacheMethod[]=object ObjectFilter[] ObjectFilter[]=74
如果"article2"被修改,svcs 会扫描"path_string"中的祖先节点(节点80,78,77,...)并检查它们的对象ID 是否在"ObjectFilter[]"数组中列出,因此"Company"页面会被包含在附加节点中。系统将只会清除"article2","News"和"Company"节点的视图缓存(根据默认的行为以及附加的svcs 规则)。"About"页面的视图缓存不会被清除,因为它的对象ID 不是74。
例4
如果您希望在特殊类型的对象被修改时,清除一组特定对象的视图缓存,必须在"AdditionalObjectIDs[]"数组中指定一组对象ID。假设"Archive"文件夹和"CD"商品的对象ID 为64 和69,可以在管理站点入口(例:admin)的"viewcache.ini.append.php"中指定以下配置:
[article] AdditionalObjectIDs[] AdditionalObjectIDs[]=64 AdditionalObjectIDs[]=69
这会要求系统当一篇文章(任何文章)被修改时,总是清除"Archive"文件夹和"CD"商品的视图缓存。这意味着修改"article2"会导致"article2","News","Archive"和"CD"的视图缓存。
例5
假设已经在管理站点入口的"viewcache.ini.append.php"中指定了如下配置:
[article] AdditionalObjectIDs[] AdditionalObjectIDs[]=69 [product] AdditionalObjectIDs[] AdditionalObjectIDs[]=64
"[article]"配置块中的配置会要求系统当一篇文章被修改时,总是清除"CD"商品的视图缓存。这意味着。修改"article2“会导致"article2","News"和"CD"的视图缓存被清除。当清除"CD"商品的缓存时,svcs 会应用"[product]"配置块内的规则,因此"Archive"文件夹的视图缓存也会被清除。
预生成视图缓存[ ]
以上介绍的“请求时缓存”解决方案假定页面第一次被访问时,需要即时生成页面的视图缓存。此外,“发布时缓存”功能允许在创建/编辑节点时生成节点的视图缓存。这会对发布过程的速度有一些影响(对于有很多内容编辑的站点,不建议使用),但是却可以减少页面的响应时间。
“发布时缓存”特性默认被禁用。这个行为由"site.ini"中的"[ContentSettings]"章节下的"PreViewCache"设定。请注意,启用这一特性只会影响节点的"full"视图模式。当一个对象被发布时,系统会为这个对象所有的发布节点以及它们的父节点生成视图缓存。相同位置的"PreCacheSiteaccessArray"设置控制应该为哪些站点入口生成视图缓存(通常需要为公共站点入口生成视图缓存)。
如果希望在发布对象时创建视图缓存,在管理站点入口的"site.ini.append.php"中的"[ContentSetings]"章节下添加如下配置:
PreViewCache=enabled PreCacheSiteaccessArray[] PreCacheSiteaccessArray[]=example
这会启用“发布时缓存”特性并要求系统为"example"站点入口创建发布时缓存。如果有一个新闻文件夹,它包含很多文章,编辑其中一篇文章会导致文章本身和它的父节点(新闻文件夹)的视图缓存被重新生成。当一篇新文章被发布在新闻文件夹中时,系统会为新文章创建视图缓存并重新生成新闻文件夹的视图缓存。
请注意,默认情况下,系统只会生成匿名用户的视图缓存。这是在"site.ini"重设文件中"[ContentSettings]"章节下的"PreviewCacheUsers"配置项来指定的。