第十二章-缓存
加速应用程序的方法之一是存储块生成的HTML代码,甚至整页,为未来的请求。这种技术被称为缓存,它可以管理在服务器端和客户端。
ob娱乐下载Symfony提供了一个灵活的server-caching系统。它允许保存完整的反应,一个动作的结果,部分,或一个模板片段到一个文件中,通过一个非常直观的设置基于YAML文件。当底层数据发生变化时,你可以很容易地明确的选择性部分缓存的命令行或特殊的操作方法。ob娱乐下载Symfony还提供了一个简单的方法来控制客户端缓存通过HTTP 1.1头。这一章处理所有这些主题,和给你一些小贴士监控缓存可给您的应用程序的改进。
缓存的响应
HTML缓存的原则很简单:部分或全部的HTML代码发送到用户在请求可以重用一个类似的请求。这个HTML代码(存储在一个特殊的位置缓存/
在symfony)文ob娱乐下载件夹,前端控制器将寻找之前执行一个动作。如果找到一个缓存的版本,它发送没有执行行动,因此大大加快这一过程。如果没有找到缓存的版本,执行操作,其结果(视图)存储在缓存文件夹为未来的请求。
所有的页面可能包含动态信息,HTML缓存在默认情况下是禁用的。由站点管理员启用它,以提高性能。
ob娱乐下载Symfony处理三种不同类型的HTML缓存:
- 缓存的一个动作(有或没有布局)
- 缓存的部分或组件
- 模板缓存的片段
前两个类型是YAML处理配置文件。模板片段缓存由调用模板中辅助函数。
全局缓存设置
为每个应用程序的一个项目,HTML可以启用或禁用缓存机制(默认),每个环境,缓存
的设置settings.yml
文件。清单第四节演示了启用缓存的能力。请注意这不会导致任何缓存;所以你必须在每个模块启用高速缓存/行动(见下文)。
缓存清单第四节-激活,前端/ config / settings.yml
戴夫:.settings:缓存:真的
缓存一个动作
行动显示静态信息(不是根据数据库或session-dependent数据)或行动从数据库读取信息但没有修改它(通常,GET请求)往往是理想的缓存。图第四节显示缓存页面的哪些元素在这种情况下:行动结果(其模板)或行动的结果一起布局。
图第四节-缓存操作
例如,考虑一个用户/列表
行动,返回一个网站的所有用户的列表。除非用户修改、添加或删除(这将在稍后讨论的“从缓存中删除项”部分),这个列表总是显示相同的信息,所以这是一个很好的候选人缓存。
缓存激活和设置,行动,行动,定义在一个cache.yml
文件位于模块配置/
目录中。清单12显示了一个例子。
清单12 -激活缓存的行动,前端/模块/ user / config / cache.yml
列表:启用:真with_layout:假#一生默认值:86400 #默认值
这个配置规定缓存列表上的行动,和布局不会被缓存操作(这是默认行为)。这意味着即使一个缓存版本的行为存在,布局(连同它的泛音和组件)仍在执行。如果with_layout
设置被设置为真正的
,布局与动作缓存,而不是再次执行。
测试缓存设置,在开发环境中调用行动从你的浏览器。
http://myapp.example.com/frontend_dev.php/user/list
你会发现页面边框行动区。第一次,这个地区有一个蓝色的头,表明它并非来自缓存。刷新页面,操作区域会有一个黄色的头,表明它来自缓存(显著提高响应时间)。你会了解更多的方法来测试和监控缓存在本章后面。
请注意
槽是模板的一部分,和缓存一个动作也会储存槽中定义的值这一行动的模板。所以缓存本地适合槽。
页面的缓存系统也适用参数。的用户
模块,例如,一个显示
行动,预计一个id
参数显示用户的详细信息。修改cache.yml
文件来启用缓存这个动作,如清单12所示。
以组织cache.yml
,你可以重新设置下一个模块的行为全部:
关键,也如清单12所示。
清单12 -一个完整的cache.yml
例如,在前端/模块/ user / config / cache.yml
列表:启用:真正的显示:启用:真:with_layout:假#一生默认值:86400 #默认值
现在,每一个调用用户/显示
行动有不同id
参数在缓存中创建一个新的记录。因此,缓存:
http://myapp.example.com/user/show/id/12
将不同的缓存:
http://myapp.example.com/user/show/id/25
谨慎
行动称为POST方法或参数不缓存。
的with_layout
设置值得更多的单词。它实际上决定了什么样的数据是存储在缓存中。缓存中没有布局,只有模板执行和操作的结果变量是存储在缓存中。缓存的布局,整个响应对象存储。这意味着缓存与布局缓存没有它要快得多。
功能如果你能负担得起(也就是说,如果布局不依赖session-dependent数据),你应该选择缓存与布局。不幸的是,通常包含了一些动态的布局元素(例如,用户连接的名称),所以动作缓存没有布局是最常见的配置。然而,RSS提要,弹出页面,不依赖于饼干可以缓存的布局。
缓存部分或组件
第七章解释了如何跨多个模板,重用代码片段使用include_partial ()
帮手。部分一样容易缓存一个动作,和它的缓存激活遵循相同的规则,如图12所示。
图12 -缓存部分或组件
例如,清单以显示了如何编辑cache.yml
文件上启用缓存_my_partial.php
部分位于用户
模块。请注意,with_layout
在这种情况下设置不合理。
清单以12比4 -缓存部分前端/模块/ user / config / cache.yml
_my_partial:启用:真正的列表:启用:真…
现在所有的模板使用这部分不会实际执行的PHP代码部分,而是将使用缓存版本。
< ? phpinclude_partial(“用户/ my_partial”)? >
一样操作,部分缓存也相关部分的结果取决于参数。缓存系统将存储尽可能多的版本的模板有不同的参数值。
< ? phpinclude_partial(“用户/ my_other_partial”,数组(“foo”= >“酒吧”))? >
提示
动作缓存比部分更强大的缓存,因为当一个行动是缓存,模板不执行;如果模板包含调用泛音,这些调用执行。因此,部分缓存是有用的只有如果你不使用动作缓存的行动或呼吁泛音包含在布局。
从第七章一个小提醒:一个组件是一个光行动把最重要的部分。这种包含非常类似于泛音,支持缓存以同样的方式。例如,如果你的全球布局包括组件调用一天
与include_component(一般/天)
为了显示当前日期,设置cache.yml
文件的一般
模块上启用缓存这个组件如下:
_day:启用:真的
缓存组件或部分时,您必须决定是否存储所有调用模板或一个版本一个版本为每个模板。默认情况下,组件是独立存储的模板调用它。但上下文组件,如组件与每个行动,显示不同的栏应该存储多少次就有模板调用它。缓存系统可以处理这种情况下,只要你设置上下文
参数真正的
,如下所示:
_day:上下文:真正启用:真的
请注意
全球(位于应用程序的组件模板/
可以缓存目录),只要你宣布他们的应用程序的缓存设置cache.yml
。
缓存一个模板片段
动作缓存只适用于操作的一个子集。对于其他动作——那些更新数据或显示session-dependent信息模板中,仍有改进缓存空间但以不同的方式。ob娱乐下载Symfony提供了第三个缓存类型,它致力于模板片段和直接在模板启用。在这种模式下,动作总是执行,和模板分为片段和片段缓存中执行,如图12所示。
图12 -缓存一个模板片段
例如,您可能有一个用户列表显示上次访问用户的链接,这信息是动态的。的缓存()
帮助定义了一个模板的部分放在缓存中。有关详细信息,请参阅清单后)的语法。
清单后)——使用缓存()
助手,前端/模块/ user /模板/ listSuccess.php
< !——代码执行每一个时间- - >< ? php回声link_to(“去年访问用户”,“用户/节目? id =”。last_accessed_user_id美元)? >< !——缓存代码- - >< ? php如果(缓存!(“用户”)):? >< ? phpforeach(美元的用户作为$ user):? >< ? php回声$ user- >getName()? >< ? phpendforeach;? >< ? phpcache_save()? >< ? phpendif;? >
它是如何工作的:
- 如果一个片段的缓存版本命名的用户的,它是用来替代之间的代码
< ? php如果(缓存!($unique_fragment_name)): ?>
和< ? phpendif;? >
行。 - 如果不是这样,这些线之间的代码处理和保存在缓存中,与独特的片段的名字。
之间的代码不包含这样的线总是处理和缓存。
谨慎
行动(列表
示例中)必须没有启用缓存,因为这将绕过整个模板执行和忽略片段缓存宣言。
使用模板片段缓存的速度提高明显不如缓存与行动,行动总是执行以来,部分处理模板和布局总是用于装饰。
您可以声明额外的碎片在同一个模板;然而,你需要给他们每个人一个唯一的名称,因此symfony缓存系统之后可以找到他们。ob娱乐下载
与行为和组件,缓存碎片可能要花一生的时间在几秒钟内调用的第二个参数缓存()
帮手。
< ? php如果(缓存!(“用户”,43200年)):? >
默认的缓存生命周期(86400秒,或一天)如果没有给定参数用于辅助。
提示
做一个动作缓存的另一种方法是将变量,使其改变插入行动的路由模式。例如,如果一个主页显示连接用户的名称,它不能被缓存,除非URL包含用户昵称。国际化了的应用程序的另一个例子是:如果你想启用高速缓存的页面上有几个翻译,语言代码必须被包括在URL模式。这个技巧会把缓存的页面数量,但它可以很大的帮助加快大量交互的应用程序。
配置缓存动态
的cache.yml
文件是定义缓存设置的一种方式,但它的不便是不变的。然而,像往常一样在symfony中,您可以ob娱乐下载使用纯PHP而不是YAML,这允许您配置动态缓存。
为什么你要改变动态缓存设置?一个很好的例子是一个页面,为通过身份验证的用户和匿名的不同,但是URL是相同的。想象一个/显示条
文章页面评级系统。匿名用户的评级功能被禁用。对于这些用户来说,评级链接触发一个登录表单的显示。这个版本的页面可以缓存。另一方面,通过身份验证的用户,点击一个评级链接使一个POST请求并创建一个新评级。这一次,必须禁用缓存这symfony构建动态的页面。ob娱乐下载
正确的位置来定义动态缓存设置在一个过滤器之前执行sfCacheFilter
。事实上,缓存是一个过滤器在symfony中,就像安全特性。ob娱乐下载为了启用缓存/显示条
页面只有在用户没有通过身份验证,创建一个conditionalCacheFilter
在应用程序中lib /
目录,见清单劲旅。
清单劲旅-配置缓存PHP、前端/ lib / conditionalCacheFilter.class.php
类conditionalCacheFilter扩展sfFilter{公共函数执行(filterChain美元){美元的上下文=这个美元- >getContext();如果(!美元的上下文- >getUser()- >isAuthenticated()){foreach(这个美元- >getParameter(“页面”)作为美元的页面){美元的上下文- >getViewCacheManager()- >addCache(美元的页面(“模块”],美元的页面(“行动”],数组(“一生”= >86400年));}}/ /执行下一个过滤器filterChain美元- >执行();}}
你必须注册这个过滤器filters.yml
之前的文件sfCacheFilter
,见清单12-7。
清单12-7 -注册您的自定义过滤器,前端/ config / filters.yml
…安全:~ conditionalCache:类:conditionalCacheFilter参数:页面:- - - - - -{模块:文章中,行动:显示}缓存:~…
清除缓存(自动装载新的过滤器类),和条件缓存已经准备好了。它将使缓存的页面中定义的页面参数只对没有经过身份验证的用户。
的addCache ()
的方法sfViewCacheManager
对象预计一个模块的名字,一个动作名称,关联数组具有相同参数的定义在一个cache.yml
文件。例如,如果您想要定义的/显示条
行动必须缓存与布局和一生的3600秒,然后编写以下:
美元的上下文- >getViewCacheManager()- >addCache(“文章”,“显示”,数组(“withLayout”= >真正的,“一生”= >3600年,));
侧边栏
选择缓存存储
默认情况下,symfony缓存系ob娱乐下载统将数据存储在web服务器硬盘上的文件。你可能想要存储在内存中缓存(例如,通过memcached)或在数据库中(特别是如果你想分享你的缓存多个服务器或加速缓存中删除)。你可以很容易地改变symfony的默认缓存ob娱乐下载存储系统,因为缓存类使用的symfony视图中定义的缓存管理器factories.yml
。
默认视图缓存存储工厂sfFileCache
类:
view_cache:类:sfFileCache参数:automaticCleaningFactor: 0 cacheDir: % SF_TEMPLATE_CACHE_DIR %
你可以替换类
与自己的缓存存储类或一个symfony替代类(包括ob娱乐下载sfAPCCache
,sfEAcceleratorCache
,sfMemcacheCache
,sfSQLiteCache
,sfXCacheCache
)。下定义的参数参数
关键是通过缓存类的构造函数作为一个关联数组中。任何视图缓存存储类必须实现所有方法中发现的抽象sfCache
类。指的是第十九章有关这个主题的更多信息。
使用两个memcache服务器配置memcache后端:view_cache:类:sfMemcacheCache参数:服务器:server_1:主持人:192.168.1.10 server_2:主持人:192.168.1.11
使用超级快速缓存
甚至一个缓存页面涉及一些PHP代码的执行。对于这样一个页面,symfony仍ob娱乐下载然加载配置,构建响应,等等。如果你真的相信一个页面是不会改变,你可以完全绕开symfony将生成的HTML代码直接进入ob娱乐下载web /
文件夹中。这是由于Apachemod_rewrite
设置,提供你的路由规则指定一个模式没有后缀或结束. html
。
你可以用手,一页页,用一个简单的命令行调用:
curl http://myapp.example.com/user/list.html > web / user / list.html美元
在那之后,每一次用户/列表
操作请求,Apache找到对应的list.html
页面和完全绕过symfony。ob娱乐下载代价是你不能控制页面缓存symfony了(一生,自动删除,等等),但是速度获得非常令人印象深刻。ob娱乐下载
或者,您可以使用sfSuperCache
ob娱乐下载symfony插件,自动化过程和支持生命周期和缓存清理。参阅第17章关于插件的更多信息。
侧边栏
其他加速策略
除了HTML缓存,symfony有两个其他的缓存机制,对开发人ob娱乐下载员是完全自动的,透明的。在生产环境中,配置和模板的翻译文件存储在缓存/ config / myproject /缓存
和i18n / myproject /缓存
目录没有任何干预。
PHP加速器(eAccelerator APC, XCache,等等),也称为操作码缓存模块,提高性能的PHP脚本编译缓存的状态,这样的开销几乎完全消除了解析和编译代码。这是特别有效的orm类,含有大量的代码。这些加速器兼容symfony,可以很容易地应用程序的速度的三倍。ob娱乐下载他们建议在生产环境中任何拥有大量观众的symfony应用程序。ob娱乐下载
使用一个PHP加速器,您可以手动存储持久数据在内存中,以避免为每个请求做同样的处理,与sfAPCCache
类如果使用例如APC。如果你想要缓存的结果cpu密集型功能,您可能会使用sfFunctionCache
对象。请参考第18章关于这些机制的更多信息。
从缓存中移除项
如果脚本或应用程序的数据变化,缓存将包含过时的信息。为了避免混乱和错误,您可以删除缓存的部分在许多不同的方式,根据您的需要。
清除整个缓存
的缓存:清晰
任务的symfony命令ob娱乐下载行擦除缓存(HTML、配置、路由和i18n缓存)。你可以通过参数只擦除缓存的一个子集,见清单6负。记得要叫它只从一个symfony项目的根源。ob娱乐下载
清单6负-清除缓存
/ /擦除整个缓存php symfony美元缓存:明确/ /短ob娱乐下载语法美元php symfony cc / /擦除缓存的前端应用程序缓存php symfony美元:明确——应用=前端/ /擦除美元只有HTML前端应用程序的缓存php symfony缓存:明确——应用=前端type =模板只/ /擦除配置前端应用程序的缓存/ / built-types配置,i18n,路由和模板。美元php ob娱乐下载symfony缓存:明确——应用=前端type =只配置/ /擦除缓存的配置的前端应用程序和环境刺激美元php symfony缓存:明确——应用=前端- type =配置- env =刺激
清算的选择性部分缓存
数据库更新时,缓存的操作修改相关数据必须清除。你可以清楚整个缓存,但这将是一个浪费的所有现有缓存行为模式变化无关的。这就是remove ()
的方法sfViewCacheManager
对象适用。预计一个内部URI作为参数(同样的参数你将提供link_to ()
),并删除缓存相关的行动。
例如,假设更新
行动的用户
模块修改的列用户
对象。缓存的版本的列表
和显示
行动需要清除,否则旧的版本,包含错误的数据,显示。为了处理这个问题,使用remove ()
方法,如清单12-9所示。
清单12-9 -给定行动,清除缓存模块/ user /行动/ actions.class.php
公共函数executeUpdate(美元的请求){/ /更新用户user_id美元=美元的请求- >getParameter(“id”);$ user= UserPeer::retrieveByPk(user_id美元);这个美元- >forward404Unless($ user);$ user- >setName(美元的请求- >getParameter(“名字”));…$ user- >保存();/ /清除缓存与该用户相关的行动美元的缓存管理器=这个美元- >getContext()- >getViewCacheManager();美元的缓存管理器- >删除(“用户/列表”);美元的缓存管理器- >删除(“用户/节目? id =”。user_id美元);…}
删除缓存的泛音和组件是一个小技巧。可以将它们传递任何类型的参数(包括对象),几乎不可能把自己的缓存版本。让我们关注泛音,解释是相同的其他模板组件。ob娱乐下载Symfony标识一个缓存部分特别前缀(sf_cache_partial
)、模块的名称和部分的名称,再加上一个散列的所有参数用来称呼它,如下:
/ /部分调用< ? phpinclude_partial(“用户/ my_partial”,数组(“用户”= >$ user)? >/ /标识在缓存中@sf_cache_partial吗?模块=用户操作= _my_partial &sf_cache_key = bf41dd9c84d59f3574a5da244626dcc8
从理论上讲,你可以删除缓存部分的remove ()
方法如果你知道参数的散列的值用于识别它,但这是行不通的。幸运的是,如果你添加一个sf_cache_key
参数include_partial ()
助手的电话,您可以缓存中的部分认同你知道的东西。清单成员中可以看到,清理一个缓存部分——例如,清理缓存部分的基础上修改用户
——变得容易。
清单成员——从缓存中清除泛音
< ? phpinclude_partial(“用户/ my_partial”,数组(“用户”= >$ user,“sf_cache_key”= >$ user- >getId())? >/ /标识在缓存中=用户操作= _my_partial&sf_cache_key = @sf_cache_partial ?模块12/ /清楚_my_partial为特定用户在缓存中美元的缓存管理器- >删除(“@sf_cache_partial ?模块=用户操作= _my_partial &sf_cache_key = '。$ user- >getId());
清除模板片段,使用相同的remove ()
方法。缓存中的键识别片段组成是相同的sf_cache_partial
模块名称前缀,动作名称,sf_cache_key
(包括缓存的惟一名称片段的缓存()
助手)。清单12 11显示了一个示例。
清单12 11 -清除模板片段缓存
< !——缓存代码- - >< ? php如果(缓存!(“用户”)):? >…/ /不管< ? phpcache_save()? >< ? phpendif;? >/ /标识在缓存中=用户操作= list&sf_cache_key =用户@sf_cache_partial ?模块/ /清除它美元的缓存管理器- >删除(“@sf_cache_partial ?模块=用户操作= &sf_cache_key =用户列表);
侧边栏
选择性缓存清理会损害你的大脑
最棘手的部分缓存清理工作是确定哪些行为是受到一个数据更新。
例如,假设当前的应用程序出版
模块列出出版物(列表
行动)和描述(显示
行动)以及作者的细节(的一个实例用户
类)。修改一个用户记录将会影响所有的描述用户的出版物和出版物的列表。这意味着您需要添加的更新
行动的用户
模块,是这样的:
$ c=新标准();$ c- >添加(PublicationPeer::AUTHOR_ID,美元的请求- >getParameter(“id”));美元的出版物= PublicationPeer::doSelect($ c);美元的缓存管理器= sfContext::getInstance()- >getViewCacheManager();foreach(美元的出版物作为美元出版){美元的缓存管理器- >删除(“出版/显示? id =”。美元出版- >getId());}美元的缓存管理器- >删除(“出版/列表”);
当你开始使用HTML缓存时,你需要保持清晰的视图模型和行动之间的依赖关系,以便出现新的错误不要因为误解的关系。记住,所有的操作修改模型应该包含一系列的调用remove ()
方法如果使用HTML缓存应用程序中的某个地方。
如果你不想伤害你的大脑太困难分析,你总是可以清楚整个缓存每次更新数据库……
清理一些缓存部分
的remove ()
方法接受键与通配符。它允许您删除一些缓存部分用一个电话。你可以做例如:
美元的缓存管理器- >删除(“用户/节目? id = *”);/ /删除所有用户记录
另一个很好的例子是与应用程序处理好几种语言,在语言代码出现在所有url。用户个人资料页面的URL应该像这样:
http://www.myapp.com/en/user/show/id/12
删除缓存配置文件的用户拥有一个id
的12
在所有的语言中,您可以简单地调用:
美元的缓存- >删除(“用户/显示? sf_culture = * id = 12 ');
这也适用于分音:
美元的缓存管理器- >删除(“@sf_cache_partial ?模块=用户操作= _my_partial &sf_cache_key = *’);/ /删除键
的remove ()
方法接受两个参数,允许您定义哪些主机和不同标题你想清除缓存。这是因为symfony保持一个缓ob娱乐下载存的版本为每个主机和标题不同,这两个应用程序共享相同的代码基础但不是相同的主机名使用不同的缓存。这可能是伟大的使用,例如,当应用程序解释作为请求参数(如子域名http://php.askeet.com
和http://life.askeet.com
)。如果你不设置两个参数,symfony会删除缓存当前主机和ob娱乐下载所有
不同的标题。或者,如果您想要删除缓存主机,电话remove ()
如下:
美元的缓存管理器- >删除(“用户/节目? id = *”);/ /删除记录当前主机和所有用户美元的缓存管理器- >删除(“用户/节目? id = *”,“life.askeet.com”);/ /删除记录主机life.askeet.com和所有用户美元的缓存管理器- >删除(“用户/节目? id = *”,‘*’);/ /删除记录为每个主机和所有用户
的remove ()
方法适用于所有的缓存策略,您可以定义factories.yml
(不只是sfFileCache
,但也sfAPCCache
,sfEAcceleratorCache
,sfMemcacheCache
,sfSQLiteCache
,sfXCacheCache
)。
清理缓存跨应用程序
清理缓存跨应用程序可能是一个问题。例如,如果管理员修改的记录用户
表后端
应用程序,根据该用户的所有操作前端
应用程序需要从缓存中清除。但是视图缓存管理器中可用后端
应用程序不知道前端
应用程序路由规则(应用程序相互隔离)。所以你不能后台编写这段代码:
美元的缓存管理器= sfContext::getInstance()- >getViewCacheManager();/ /检索视图缓存管理器的后端美元的缓存管理器- >删除(“用户/节目? id = 12”);/ /没有找到模式,因为在前端模板缓存
解决方案是初始化一个sfCache
相同的对象,设置前端缓存管理器。幸运的是,在symfony提供所有缓存类ob娱乐下载removePattern
方法提供相同的服务视图缓存管理器的删除
。
例如,如果后端
应用程序需要清除缓存用户/显示
行动前端
应用程序的用户id
12
,它可以使用以下:
frontend_cache_dir美元= sfConfig::得到(“sf_cache_dir”).DIRECTORY_SEPARATOR。“前端”。DIRECTORY_SEPARATOR.sfConfig::得到(“sf_environment”).DIRECTORY_SEPARATOR。“模板”;美元的缓存=新sfFileCache(数组(“cache_dir”= >frontend_cache_dir美元));/ /使用相同的设置前端factories.yml中定义的美元的缓存- >removePattern(“用户/节目? id = 12”);
对于不同的缓存策略,你只需要改变缓存对象的初始化,但缓存删除过程是一样的:
美元的缓存=新sfMemcacheCache(数组(“前缀”= >“前端”));美元的缓存- >removePattern(“用户/节目? id = 12”);
测试和监控缓存
HTML缓存,如果不妥善处理,可以创建显示数据不一致。每次你禁用缓存一个元素,你应该彻底测试和监控执行促进调整它。
建立一个登台环境
缓存系统是容易新的错误在生产环境中不能被发现在开发环境中,由于开发的HTML缓存在默认情况下是禁用的。如果你启用HTML缓存一些动作,你应该添加一个新环境,称为分段在本节中,相同的设置刺激
环境(因此,启用了缓存)web_debug
设置为真正的
。
设置它,编辑settings.yml
应用程序的文件并添加清单顶部12-12行所示。
清单12-12——设置暂存
环境,在前端/ config / settings.yml
分段:.settings: web_debug:真正的缓存:真的
此外,创建一个新的前端控制器(可能通过复制生产myproject / web / index . php
)到一个新的frontend_staging.php
。改变的参数传递给编辑它getApplicationConfiguration ()
方法,如下:
美元配置= ProjectConfiguration::getApplicationConfiguration(“前端”,“暂存”,真正的);
就是这样,你有一个新的环境。使用它通过添加前端控制器名称后的域名:
http://myapp.example.com/frontend_staging.php/user/list
监控性能
第十六章将探讨网络调试工具栏和其内容。然而,这个工具栏提供了有价值的信息缓存的元素,这是一个简短描述的缓存功能。
当你浏览到一个页面,该页面包含缓存元素(行动,泛音,片段,等等),web调试工具栏(在窗口的右上角)显示了一个忽略缓存(一个绿色的箭头)按钮,如图以12比4。这个按钮重新加载页面和部队缓存元素的处理。请注意,它不清除缓存。
最后一个数字调试工具栏的右边是执行请求的持续时间。如果你启用缓存页面上,这个数字应该减少第二次加载页面,因为symfony使用后处理的数据从缓存中而不是脚本。ob娱乐下载您可以轻松监控缓存改进这个指标。
图以12比4 - Web调试工具栏使用缓存页面
调试工具栏也显示了一些数据库查询执行的处理请求期间,每个类别的详细时间(点击总持续时间显示细节)。监测数据,结合总持续时间,会有助于你细缓存带来的性能改进的措施。
基准测试
调试模式大大降低应用程序的速度,因为很多信息记录和可用web调试工具栏。所以当你浏览显示的处理时间暂存
环境并不代表它将在生产、调试模式是关闭的。
为了更好地对每个请求的处理时间,您应该使用基准测试工具,如Apache长凳或JMeter。这些工具允许负载测试,并提供两个重要的信息:一个特定页面的平均加载时间和服务器的最大容量。平均加载时间数据监控性能改进是非常有用的,因为缓存激活。
确定缓存部分
启用web调试工具栏时,缓存的页面元素识别一红色的框架,每一方都有一个缓存信息框左上角,如图赔率。盒子里有一个蓝色背景如果元素已经被执行,或者如果它来自缓存黄色背景。点击缓存的缓存信息链接显示标识符的元素,它的生命周期,自最后一次修改的时间。这将帮助您识别问题脱离环境的元素,在处理时看到模板的元素创建和哪些部分你可以缓存。
图后,识别缓存的页面元素
HTTP 1.1,客户端缓存
HTTP 1.1协议定义了一群头可以用于进一步的加快应用程序通过控制浏览器的缓存系统。
HTTP 1.1规范的World Wide Web Consortium (W3C,http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)详细描述这些标题。如果一个动作启用了缓存,它使用with_layout
选项,它可以使用一个或多个以下部分中描述的机制。
即使一些你的网站的用户的浏览器可能不支持HTTP 1.1,没有风险使用HTTP 1.1缓存功能。浏览器接收头,它不理解简单地忽略他们,所以建议您设置HTTP 1.1缓存机制。
此外,HTTP 1.1头也理解代理和缓存服务器。即使用户的浏览器并不理解HTTP 1.1,可以有一个代理在路由请求的利用它。
添加一个ETag头避免发送不变的内容
ETag功能启用时,web服务器增加了响应的响应包含签名的特殊头本身。
ETag:“1 a2z3e4r5t6y7u”
用户的浏览器将存储这个签名,发送一遍一起请求下一次需要相同的页面。如果新的签名显示页面并没有改变自第一个请求,服务器不发回响应。相反,它只是发送一个304:不修改
头。它可以节省CPU时间(例如如果启用gzip)服务器和带宽(页面转移),为客户机和时间(转页)。总的来说,页面缓存的ETag比页面缓存加载更快没有ETag。
在syob娱乐下载mfony中,您的整个应用程序启用ETag特性settings.yml
。这是默认的ETag设置:
:.settings: etag:真的
行动的一个缓存与布局,是直接取自的响应缓存/
目录,所以这个过程更快。
添加一个last - modified头避免发送仍然有效的内容
当服务器向浏览器发送的响应时,它可以添加一个特殊的头指定页面中包含的数据是上次改变:
最后修改:坐,2010年11月23日13:27:31格林尼治时间
浏览器能够理解这个头,再次请求页面时,添加一个If-Modified
相应的标题:
if - modified - since:坐,2010年11月23日13:27:31格林尼治时间
服务器可以比较值由客户端和一个返回的应用程序。如果他们匹配,服务器返回一个304:不修改
头,节省带宽和CPU时间,正如etag。
在syob娱乐下载mfony中,您可以设置last - modified
响应头就像一头。例如,您可以使用这样一个动作:
这个美元- >getResponse()- >setHttpHeader(“last - modified”,这个美元- >getResponse()- >获取当前日期(美元的时间戳));
这个日期可以实际使用的数据最后更新日期在页面,从你的数据库或文件系统。的获取当前日期()
的方法sfResponse
对象将时间戳转换为格式化日期所需的格式last - modified
头(RFC1123)。
添加不同头允许几个页面的缓存版本
另一个HTTP 1.1头不同
。它定义了哪些参数取决于一个页面,使用浏览器和代理建立缓存键。例如,如果一个页面的内容取决于饼干,你可以设置它不同
头如下:
不同:饼干
通常,很难使缓存行为,因为页面上可能会有所不同根据cookie,用户的语言,或别的东西。如果你不介意扩大缓存的大小,设置不同
头的正常反应。可以为整个应用程序或在每个动作的基础上,使用cache.yml
配置文件或sfResponse
相关的方法如下:
这个美元- >getResponse()- >addVaryHttpHeader(“饼干”);这个美元- >getResponse()- >addVaryHttpHeader(“用户代理”);这个美元- >getResponse()- >addVaryHttpHeader(“接收语言”);
ob娱乐下载Symfony将存储一个不同版本的页面在缓存中为每个这些参数的值。这将增加缓存的大小,但每当服务器接收请求匹配这些标题,来自缓存的响应,而不是处理。这是一个伟大的性能工具,只有根据不同的页面请求头。
添加一个cache - control头允许客户端缓存
到目前为止,即使通过添加头文件,浏览器一直发送请求到服务器,即使它拥有缓存版本的页面。你可以避免,通过添加cache - control
和到期
头的响应。这些标题是在PHP,在默认情况下禁用,但symfony可以覆盖这一行为,以避免不必要的服务器的请求。ob娱乐下载
像往常一样,你触发的行为通过调用一个方法sfResponse
对象。在一个动作,定义的最长时间一页应该缓存(以秒为单位):
这个美元- >getResponse()- >addCacheControlHttpHeader(“max_age = 60 ');
还可以指定在哪些条件下可以缓存页面,所以提供者的缓存并不保持私有数据的副本(比如银行账号):
这个美元- >getResponse()- >addCacheControlHttpHeader(“私人= True”);
使用cache - control
HTTP指令,得到能够微调您的服务器和客户端之间的各种缓存机制的浏览器。这些指令的详细审查,请参阅W3Ccache - control
规范。
最后一头可以通过symfony:设置ob娱乐下载到期
标题:
这个美元- >getResponse()- >setHttpHeader(“过期”,这个美元- >getResponse()- >获取当前日期(美元的时间戳));
谨慎
打开的主要结果cache - control
机制是你的服务器日志不会显示所有用户发出的请求,但只有实际收到的。如果性能变得更好,明显受欢迎网站的统计数据可能会减少。
总结
缓存系统提供根据缓存类型选择变量的性能得到提升。从最好的获得至少缓存类型如下:
- 超级缓存
- 动作缓存与布局
- 动作缓存没有布局
- 片段缓存的模板
此外,泛音和组件可以缓存。
如果改变数据在模型中或在会话中迫使你擦除缓存的一致性,你可以细粒度的最佳性能,消除元素发生了变化,并保持。
记得要测试所有的页面缓存启用额外的护理,随着新的bug可能出现如果你缓存错误的元素或如果你忘了清除缓存更新底层数据。登台环境,致力于缓存测试,为此目的的使用。
最后,充分利用HTTP 1.1协议symfony的高级cache-tweaking功能,这将涉及客户端缓存ob娱乐下载任务和提供更多的性能收益。
这项工作是GFDL许可执照。