使用边缘包含
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.3,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
使用边缘包含
网关缓存是一种让你的网站表现更好的好方法。但是它们有一个限制:它们只能缓存整个页面。如果您的页面包含动态部分,例如用户名或购物车,那么您就不走运了。幸运的是,Symfony为欧宝娱乐app下载地址这些情况提供了一种解决方案,它基于一种名为应急服务国际公司,或边边包含。Akamai在2001年编写了这个规范,它允许页面的特定部分使用与主页不同的缓存策略。
ESI规范描述了可以嵌入到页面中以与网关缓存通信的标记。在Symfony中只实现了一个标记,欧宝娱乐app下载地址包括
,因为这是Akamai上下文之外唯一有用的:
1 2 3 4 5 6 7 8 9 10 11
<!文档类型超文本标记语言><超文本标记语言><身体><!——……一些内容——><!——在这里嵌入另一个页面的内容——><应急服务国际公司:包括src=“http://..”。/><!——……更多内容——>身体>超文本标记语言>
请注意
从示例中可以注意到,每个ESI标记都需要一个完全限定的URL。ESI标记表示可以通过给定URL获取的页面片段。
当处理请求时,网关缓存从它的缓存中获取整个页面,或者从后端应用程序请求它。如果响应包含一个或多个ESI标记,则以相同的方式处理它们。换句话说,网关缓存要么从它的缓存中检索包含的页面片段,要么再次从后端应用程序请求页面片段。在解析完所有ESI标记后,网关缓存将每个ESI标记合并到主页中,并将最终内容发送到客户机。
所有这些都在网关缓存级别透明地发生(即在应用程序之外)。正如您将看到的,如果您选择利用ESI标记,Symfony将使包含它们的过程几乎毫不费力。欧宝娱乐app下载地址
在Symfony中使用ES欧宝娱乐app下载地址I
首先,要使用ESI,请确保在应用程序配置中启用它:
- YAML
- XML
- PHP
1 2 3 4
#配置/包/ framework.yaml框架:#……应急服务国际公司:{启用:真正的}
12 3 4 5 6 7 8 9 10 11 12 13 14 15
<!——config/packages/framework.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><!——……--><框架:应急服务国际公司启用=“真正的”/>框架:配置>容器>
1 2 3 4 5
/ /配置/包/ framework.php$容器->loadFromExtension (“框架”, (/ /……应急服务国际公司的= > [“启用”= >真正的)));
现在,假设您有一个相对静态的页面,除了在内容底部有一个新闻标记。欧宝app在哪里找有了ESI,你可以独立缓存页面的其他部分:欧宝app在哪里找
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ DefaultController.php/ /……类DefaultController扩展AbstractController{公共函数关于(){$响应=$这->呈现(“静态/ about.html.twig”);//设置共享的最大年龄-这也将响应标记为public$响应->setSharedMaxAge (600);返回$响应;}}
在本例中,全页缓存的生存期为10分钟。接下来,通过嵌入一个动作将新闻标记包欧宝app在哪里找含在模板中。这是通过呈现()
助手(有关详细信息,请参见如何在模板中嵌入控制器).
由于嵌入的内容来自另一个页面(或控制器),Symfony使用标准欧宝娱乐app下载地址渲染
帮助配置ESI标签:
1 2 3 4 5 6 7
{/静态/ about.html #模板。树枝#}{#你可以使用控制器引用{{render_esi(controller('App\\ controller \欧宝app在哪里找\NewsController::latest', {'maxPerPage': 5}))}}{#……或URL #}{{render_esi (url (latest_欧宝app在哪里找news,{“maxPerPage”:5}))}}
通过使用应急服务国际公司
渲染器(通过render_esi ()
Twig函数),您告诉Symfony该操作应该作为欧宝娱乐app下载地址ESI标记呈现。您可能想知道为什么要使用帮助器,而不是自己编写ESI标记。这是因为即使没有安装网关缓存,使用helper也可以使应用程序正常工作。
提示
正如您将在下面看到的maxPerPage
你传递的变量可以作为控制器的参数(例如:maxPerPage美元
).变量通过render_esi
也成为缓存键的一部分,这样就可以为每个变量和值的组合拥有唯一的缓存。
使用默认值时呈现()
函数(或将呈现器设置为内联
),在欧宝娱乐app下载地址向客户端发送响应之前,Symfony将包含的页面内容合并到主页面内容中。但是如果你用应急服务国际公司
渲染器(即调用render_esi ()
)而且如果S欧宝娱乐app下载地址ymfony检测到它正在与支持ESI的网关缓存通信,它将生成一个ESI include标记。但是,如果没有网关缓存,或者不支持ESI, Symfony就会将包含的页面内容合并到主页面中,就像您使用的那样欧宝娱乐app下载地址呈现()
.
请注意
欧宝娱乐app下载地址Symfony通过另一个由Symfony反向代理开箱即用的Akamai规范来检测网关缓存是否支持ESI。
嵌入动作现在可以完全独立于母版页指定自己的缓存规则:
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ News欧宝app在哪里找Controller.php名称空间应用程序\控制器;/ /……类欧宝app在哪里找NewsController扩展AbstractController{公共函数最新的($maxPerPage){/ /……$响应->setSharedMaxAge (60);返回$响应;}}
使用ESI,整个页面缓存的有效期为600秒,但新闻组件缓存的有效期仅为60秒。欧宝app在哪里找
当使用控制器引用时,ESI标记应该将嵌入的动作引用为可访问的URL,以便网关缓存可以独立于页面的其余部分获取它。欧宝娱乐app下载地址Symfony负责为任何控制器引用生成唯一的URL,并且它能够正确地路由它们FragmentListener必须在您的配置中启用:
- YAML
- XML
- PHP
1 2 3 4
#配置/包/ framework.yaml框架:#……片段:{路径:/ _fragment}
12 3 4 5 6 7 8 9 10 11 12 13 14 15
<!——config/packages/framework.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><!——……--><框架:配置><框架:片段路径=“/ _fragment”/>框架:配置>容器>
1 2 3 4 5
/ /配置/包/ framework.php$容器->loadFromExtension (“框架”, (/ /……“碎片”= > [“路径”= >' / _fragment ')));
ESI呈现器的一大优点是,您可以根据需要使应用程序动态,同时尽可能少地撞击应用程序。
谨慎
片段侦听器只响应已签名的请求。请求仅在使用片段呈现程序和render_esi
树枝的功能。
请注意
一旦开始使用ESI,请记住始终使用s-maxage
指令而不是信息
.由于浏览器只接收到聚合的资源,所以它不知道子组件,因此它将服从信息
指令并缓存整个页面。这是你不想要的。
的render_esi
Helper支持其他两个有用的选项:
-
alt
-
用作
alt
属性,该属性允许您指定要使用的替代URLsrc
找不到。 -
ignore_errors
-
如果设置为true,则an
onerror
属性将添加到ESI,值为继续
这表明,在发生故障时,网关缓存将无声地删除ESI标记。