HttpKernel组件:HttpKernelInterface
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
HttpKernel组件:HttpKernelInterface
在本书第二章的结尾部分,我谈到了使用Symfony组件的一个巨大好处:ob娱乐下载互操作性在所有框架和使用它们的应用程序之间。让我们实现框架,朝着这个目标迈出一大步HttpKernelInterface
:
12 3 4 5 6 7 8 9 10 11 12 13 14
名称空间ob娱乐下载\组件\HttpKernel;/ /……接口HttpKernelInterface{/ * * *@returnResponse响应实例*/公共函数处理(请求$请求,$类型= self:: MASTER_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娱乐下载\组件\HttpKernel\HttpKernelInterface;类框架实现了HttpKernelInterface{/ /……公共函数处理(请求$请求,$类型= HttpKernelInterface:: MASTER_REQUEST,$抓=真){/ /……}}
即使这个变化看起来微不足道,但它给我们带来了很多!让我们来谈谈其中最令人印象深刻的一个:透明HTTP缓存支持。
的HttpCache
类实现了一个全功能的反向代理,用PHP编写;它实现了HttpKernelInterface
然后包装另一个HttpKernelInterface
实例:
1 2 3 4 5 6 7 8
/ / example.com/web/front.php$框架=新单纯形\框架($调度程序,$匹配器,$解析器);$框架=新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/ /……公共函数indexAction(请求$请求,$一年){$leapyear=新LeapYear ();如果($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 15 16
$日期= date_create_from_format (Y-m-d H:我:年代”,“2005-10-15 10:00:00);$响应->setCache (数组(“公共”= >真正的,“etag”= >”中的“,“last_modified”= >$日期,“max_age”= >10,“s_maxage”= >10));//它等价于下面的代码$响应->setPublic ();$响应->setEtag (”中的“);$响应->setLastModified ($日期);$响应->setMaxAge (10);$响应->setSharedMaxAge (10);
在使用验证模型时,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年是闰年吗? 其他内容
要让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-error
RFC 5861中定义的HTTP缓存控制扩展。
通过添加单个接口,我们的框架现在可以从HttpKernel组件中内置的许多特性中受益;HTTP缓存只是其中之一,但它是一个重要的,因为它可以让你的应用程序飞起来!