HttpKernel组件:HttpKernelInterface

编辑本页

HttpKernel组件:HttpKernelInterface

在本书第二章的结尾部分,我谈到了使用Symfony组件的一个巨大好处:ob娱乐下载互操作性在所有框架和使用它们的应用程序之间。让我们实现框架,朝着这个目标迈出一大步HttpKernelInterface

12 3 4 5 6 7 8 9 10 11 12 13 14
名称空间ob娱乐下载组件HttpKernel/ /……接口HttpKernelInterface{/ * * *@returnResponse响应实例*/公共函数处理(请求请求类型= self:: MAIN_REQUEST,=真);}

HttpKernelInterface可能是HttpKernel组件中最重要的一段代码,不是开玩笑的。实现这个接口的框架和应用程序是完全可互操作的。此外,许多优秀的功能都是免费的。

更新你的框架,让它实现这个接口:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / example.com/src/Framework.php/ /……使用ob娱乐下载组件HttpKernelHttpKernelInterface框架实现了HttpKernelInterface{/ /……公共函数处理(请求请求类型= HttpKernelInterface:: MAIN_REQUEST,=真){/ /……}}

有了这个改变,一点点就能走很远!让我们来谈谈最令人印象深刻的优点之一:透明HTTP缓存支持。

HttpCache类实现了一个全功能的反向代理,用PHP编写;它实现了HttpKernelInterface然后包装另一个HttpKernelInterface实例:

12 3 4 5 6 7 8 9 10 11 12 13
/ / example.com/web/front.php/ /……使用ob娱乐下载组件HttpKernel框架单纯形\框架(调度程序匹配器controllerResolverargumentResolver);框架HttpKernel \ HttpCache \ HttpCache (框架HttpKernel \ HttpCache \存储(__DIR__“/ . . /缓存”));响应框架->处理(请求);响应->send ();

这就是向我们的框架添加HTTP缓存支持所需要的全部内容。是不是很神奇?

缓存的配置需要通过HTTP缓存头来完成。例如,要将响应缓存10秒,请使用回应::setTtl ()方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / example.com/src/Calendar/Controller/LeapYearController.php/ /……公共函数指数(请求请求一年{leapYearLeapYear ();如果leapYear->isLeapYear (一年)) {响应响应(“是的,今年是闰年!”);}其他的{响应响应(“不,今年不是闰年。”);}响应->setTtl (10);返回响应;}

提示

如果您通过模拟请求从命令行运行框架(要求::创建(/ is_leap_year / 2012)),您可以通过转储响应实例的字符串表示形式(echo $响应;),因为它会显示所有的标题以及响应内容。

为了验证其工作正确,在响应内容中添加一个随机数,并检查该数字每10秒才更改一次:

1
响应响应(“是的,今年是闰年!”.rand ());

请注意

在部署到生产环境时,请继续使用Symfony反向代理(非常适合共享托管),或者更好的是切换到更高效的反向代理,例如ob娱乐下载清漆

使用HTTP缓存头来管理应用程序缓存是非常强大的,并且允许您微调缓存策略,因为您可以使用HTTP规范的过期和验证模型。如果您对这些概念不熟悉,请阅读HTTP缓存Symfony文档的章节。欧宝官网下载appob娱乐下载

Response类包含允许您配置HTTP缓存的方法。其中最强大的是setCache ()因为它将最常用的缓存策略抽象到一个数组中:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
响应->setCache ([“must_revalidate”= >“no_cache”= >“no_store”= >“no_transform”= >“公共”= >真正的“私人”= >“proxy_revalidate”= >“max_age”= >600“s_maxage”= >600“不变”= >真正的“last_modified”= >\ DateTime (),“etag”= >“六边形abcdef”]);//它等价于下面的代码响应->setPublic ();响应->setMaxAge (600);响应->setSharedMaxAge (600);响应->setImmutable ();响应->setLastModified (\ DateTime ());响应->setEtag (”中的“);

在使用验证模型时,isNotModified ()方法允许您通过尽早短路响应生成来缩短响应时间:

1 2 3 4 5 6 7 8 9
响应->setETag (“whatever_you_compute_as_an_etag”);如果响应->isNotModified (请求)) {返回响应;}响应->setContent (“响应的计算内容”);返回响应

使用HTTP缓存很棒,但是如果不能缓存整个页面呢?如果您可以缓存所有内容,但某些边栏比其余内容更动态,会怎样?边边包括(应急服务国际公司)来拯救!ESI允许您将页面的一个区域标记为子请求调用的内容,而不是一次性生成整个内容:

1 2 3 4 5
这是您页面的内容2012年是闰年吗?<应急服务国际公司:包括src“leapyear / 2012”/>其他内容

要让httpache支持ESI标记,需要向它传递一个实例应急服务国际公司类。的应急服务国际公司类自动解析ESI标记并发出子请求将它们转换为适当的内容:

1 2 3 4 5
框架HttpKernel \ HttpCache \ HttpCache (框架HttpKernel \ HttpCache \存储(__DIR__“/ . . /缓存”),HttpKernel \ HttpCache \ Esi ());

请注意

为了让ESI工作,您需要使用支持它的反向代理,比如Symfony实现。ob娱乐下载清漆是最好的选择,而且它是开源的。

当使用复杂的HTTP缓存策略和/或许多ESI include标记时,可能很难理解为什么以及何时应该缓存资源。为了简化调试,您可以启用调试模式:

1 2 3 4 5 6
框架HttpKernel \ HttpCache \ HttpCache (框架HttpKernel \ HttpCache \存储(__DIR__“/ . . /缓存”),HttpKernel \ HttpCache \ Esi (), (“调试”= >真正的]);

调试模式添加X-ob娱乐下载Symfony-Cache每个响应的头,描述了缓存层做了什么:

1 2 3
X-ob娱乐下载Symfony-Cache: GET /is_leap_year/2012: stale, invalid, store X-Symfony-Cache: GET /is_leap_year/2012: fresh

httpache有很多特性,比如支持stale-while-revalidate而且stale-if-errorRFC 5861中定义的HTTP缓存控制扩展。

通过添加单个接口,我们的框架现在可以从HttpKernel组件中内置的许多特性中受益;HTTP缓存只是其中之一,但它是一个重要的,因为它可以让你的应用程序飞起来!

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop