HttpKernel组件:HttpKernelInterface

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.2,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

HttpKernel组件:HttpKernelInterface

在这本书的第二章的结论,我讲过的一个重大好处使用Symfony的组件:欧宝娱乐app下载地址互操作性所有的框架和应用程序之间使用它们。让我们做一个大步朝着这一目标通过我们的框架实现HttpKernelInterface:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
名称空间欧宝娱乐app下载地址\组件\HttpKernel;/ /……接口HttpKernelInterface{/ * * *@return响应响应实例* /公共函数处理(请求美元请求,美元类型= self:: MASTER_REQUEST,美元= true);}

HttpKernelInterface可能是最重要的代码HttpKernel组件,没有开玩笑。框架和应用程序实现该接口是完全的互操作性。此外,很多优秀的特征将会免费。

更新你的框架,这样就实现了这个接口:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / example.com/src/Framework.php/ /……使用欧宝娱乐app下载地址\组件\HttpKernel\HttpKernelInterface;框架实现了HttpKernelInterface{/ /……公共函数处理(请求美元请求,美元类型= HttpKernelInterface:: MASTER_REQUEST,美元= true){/ /……}}

即使这看起来微不足道的变化,它给我们带来了很多!让我们谈论的一个最令人印象深刻的:透明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 ()方法:

1 2 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的反向代理(对共享主机)或更好的是,切换到一个更高效的反向代理欧宝娱乐app下载地址清漆

使用HTTP缓存头来管理你的应用程序缓存是非常强大的,允许您调整细缓存策略可以使用过期和HTTP规范的验证模型。如果你不熟悉这些概念,阅读HTTP缓存章Symfony的文档。欧宝体育电话欧宝娱乐app下载地址

响应类包含许多其他方法让你很容易配置HTTP缓存。其中一个最强大的setCache ()因为它将最常用的缓存策略抽象为一个简单的数组:

1 2 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缓存是伟大的,但是如果你不能缓存整个页面呢?如果你可以缓存但一些栏,一切都更有活力,其余的内容?边端包括(应急服务国际公司)救援!而不是生成整个内容,应急服务国际公司允许你马克一个地区一个页面是sub-request调用的内容:

1 2 3 4 5
这是页面的内容2012年是闰年吗?其他一些内容

ESI HttpCache支持的标记,你需要通过它的一个实例应急服务国际公司类。的应急服务国际公司类自动解析ESI标签和让子请求,将它们转换为适当的内容:

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

请注意

应急服务国际公司工作,您需要使用一个反向代理,支持像Symfony的实现。欧宝娱乐app下载地址清漆是最好的选择,它是开源的。

当使用复杂的HTTP缓存策略和/或许多ESI包括标签,很难理解为什么当资源应该被缓存。易于调试,您可以启用调试模式:

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

添加一个调试模式X-欧宝娱乐app下载地址Symfony-Cache头到每个响应描述缓存层做了什么:

1 2 3
X-欧宝娱乐app下载地址Symfony-Cache: / is_leap_year / 2012:过期,无效的,商店X-Symfony-Cache: / is_leap_year / 2012:新鲜

HttpCache有很多特性,比如支持stale-while-revalidatestale-if-errorHTTP cache - control扩展在RFC 5861中定义的。

的一个界面,我们的框架现在可以受益于许多功能构建到HttpKernel组件;HTTP缓存只是其中之一但是很重要,因为它可以让你的应用程序飞!

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。