Jobeet——22天:缓存
以前在Jobeet
今天的教程Jobeet的最后一周开始。我们将讨论一个非常有趣的话题:缓存。
symfob娱乐下载ony框架有很多内置缓存策略。例如,YAML配置文件转换为PHP和缓存文件系统上。我们也看到生成的模块管理发电机缓存在更好的性能。
今天,我们将讨论另一个缓存:缓存的HTML。来提高你的网站的性能,您可以缓存整个HTML页面或其中的部分。
创建一个新的环境
默认情况下,模板缓存启用symfony的特性ob娱乐下载settings.yml
配置文件的刺激
环境,但不是测试
和dev
的:
刺激:.settings:缓存:dev: .settings:缓存:从测试:.settings:缓存:
因为我们需要测试缓存特性在生产,我们可以激活的缓存dev
环境或创建一个新的环境。回想一下,一个环境是由它的名字(一个字符串),定义一个相关的前端控制器,可以选择一组特定的配置值。
玩Jobeet缓存系统,我们将创建一个缓存
环境,类似于刺激
环境,但中可用的日志和调试信息dev
环境。
创建前端控制器与新的有关缓存
环境通过复制dev
前端控制器web / frontend_dev.php
来php web / frontend_cache /
:
/ /网络/ frontend_cache.php如果(!in_array(@$ _SERVER(“REMOTE_ADDR”],数组(“127.0.0.1”,“::1”))){死(“你是不允许访问这个文件。检查”。basename(__FILE__)。“更多信息”。);}require_once(目录名(__FILE__)。“/ . . / config / ProjectConfiguration.class.php”);美元配置= ProjectConfiguration::getApplicationConfiguration(“前端”,“缓存”,真正的);sfContext::createInstance除外(美元配置)- >调度();
这就是所有。新缓存
现在环境是可用的。唯一不同的是第二个参数getApplicationConfiguration ()
方法环境名称,缓存
。
你可以测试缓存
环境在浏览器中通过调用它的前端控制器:
http://jobeet.localhost/frontend_cache.php/
前端控制器脚本始于一个代码,确保前端控制器只从本地IP地址。这个安全措施防止前端控制器呼吁生产服务器。我们将讨论更多的细节在明天的教程。
目前,缓存
环境继承自默认配置。编辑settings.yml
配置文件添加缓存
环境特定的配置:
#应用/前端/ config /设置。yml缓存:.settings: error_reporting: < ?php echo (E_ALL |代码)。“\ n”? > web_debug:缓存:etag:
在这些设置,symfony模板缓存功能被激活ob娱乐下载缓存
设置和网络调试工具栏被启用web_debug
设置。
我们还希望记录SQL语句,我们需要修改数据库配置。编辑databases.yml
初和添加以下配置文件:
#配置/数据库。yml缓存:推动:类:sfPropelDatabase参数:名称:DebugPDO
作为默认配置缓存中的所有设置缓存,您需要清楚之前能够在浏览器中看到的变化:
php syob娱乐下载mfony cc美元
现在,如果你刷新浏览器,网络调试工具栏应该出现在页面的右上角,因为它是这样的dev
环境。
缓存配置
symfob娱乐下载ony模板缓存可以配置cache.yml
配置文件。应用程序的默认配置中应用程序/前端/ config / cache.yml
:
默认值:启用了with_layout:错误的一生:86400
默认情况下,所有页面可以包含动态信息,缓存是全球残疾(使:了
)。我们不需要改变这个设置,我们将启用缓存页面,页面的基础上。
的一生
设置定义了服务器端缓存的生命时间秒(86400年
等于一天)。
你也可以反过来:启用全球缓存,然后禁用特定页面无法缓存。这取决于代表应用程序的更少的工作。
页面缓存
随着Jobeet主页可能会网站的访问次数最多的页面,而不是请求的数据从数据库每次用户访问它时,它可以被缓存。
创建一个cache.yml
文件sfJobeetJob
模块:
#插件/ sfJobeetJob /模块/ sfJobeetJob / config /缓存。yml指数:启用:with_layout:真的
的
cache.yml
配置文件有相同的属性比其他symfony的配置文件ob娱乐下载view.yml
。这意味着为实例,您可以启用缓存使用特殊模块的所有操作所有
关键。
如果你的刷新浏览器,你会看到symfony装饰框显示内容的页面缓存:ob娱乐下载
盒子给一些宝贵信息的缓存键调试,如缓存的生命周期,它的年龄。
如果你再刷新页面,盒子的颜色由绿色变为黄色,表明该页面已经从缓存检索:
还要注意,没有数据库请求已经在第二种情况下,如web调试工具栏所示。
即使语言可以改变在每个用户的基础上,缓存仍然是语言是嵌入到URL中。
当一个页面被缓存,如果缓存中不存在,symfony将响应对象存储在缓存的请求。ob娱乐下载对于所有其他未来的请求,symfony将发送缓存的响应没有调用ob娱乐下载控制器:
这对性能有很大的影响,你可以测量自己使用的工具JMeter。
传入请求与
得到
参数或提交帖子
,把
,或删除
方法永远不会缓存symfony,无论配置。ob娱乐下载
创造就业的页面也可以缓存:
#插件/ sfJobeetJob /模块/ sfJobeetJob / config /缓存。yml新:启用:在索引:启用:在所有:with_layout:真的
随着两页可以缓存的布局,我们已经创建了一个所有
部分定义的默认配置sfJobeetJob
模块。
清除缓存
如果你想清除页面缓存,您可以使用缓存:清晰
任务:
php syob娱乐下载mfony cc美元
的缓存:清晰
任务主要清除所有symfony缓存存储ob娱乐下载缓存/
目录中。它还需要选择有选择性地缓存的某些部分。只有清晰的模板缓存的缓存环境,使用——类型
和- - - env
选项:
美元php ob娱乐下载symfony cc - type =模板- env =缓存
而不是清除缓存每次你做出改变,你也可以禁用缓存通过添加任何URL查询字符串,或通过使用“忽略缓存”按钮从web调试工具栏:
动作缓存
有时候,你不能缓存整个页面的缓存,但动作模板本身可以被缓存。换句话说,您可以缓存所有但布局。更改的配置指数
动作缓存相应:
#插件/ sfJobeetJob /模块/ sfJobeetJob / config /缓存。yml指数:启用:with_layout:假的
通过改变with_layout
设置为假
,你有残疾布局缓存。
清除缓存:
php syob娱乐下载mfony cc美元
刷新你的浏览器看到的区别:
即使流请求非常相似的简化图,缓存没有布局资源密集得多。
部分和组件缓存
对于高度动态的网站,有时可能缓存整个行动模板。在这些情况下,您需要一种方法来配置缓存细粒度级别的。值得庆幸的是,部件和组件可以被缓存。
我们缓存语言
组件通过创建一个cache.yml
文件sfJobeetLanguage
模块:
#插件/ sfJobeetJob /模块/ sfJobeetLanguage / config /缓存。yml _language:启用
配置的缓存部分或组件是一样简单的添加一个条目的名称。的with_layout
选择不考虑这种类型的缓存,因为它没有任何意义:
上下文呢?
同一个组件或部分可用于许多不同的模板。这份工作
列表
部分例如用于工作
和类别
模块。呈现总是相同的,偏不取决于使用它的环境和缓存是相同的所有模板(缓存仍然明显不同的一组不同的参数)。但有时,部分或组件的输出是不同的,包括基于的行动(例如,认为博客侧边栏略有不同的主页和博客页面)。在这样的情况下,部分或组件的上下文,并相应地必须配置缓存设置
上下文
选项真正的
:_sidebar:启用:上下文:真的
你现在可以恢复
with_layout
设置为真正的
作为Jobeet网站更有意义。
形式的缓存
在缓存中存储工作创建页面是有问题的,因为它包含一个表单。为了更好的理解这个问题,去“后工作”页面在浏览器缓存。然后,明确你的会话cookie,并试图提交作业。你必须看到一条错误消息提醒你“CSRF攻击”:
为什么?我们已经配置了一个CSRF的秘密,当我们创建前端应用程序,symfony嵌入各种形式的CSRF令牌。ob娱乐下载保护你免受CSRF攻击,这令牌是独特的对于一个给定的用户和对于一个给定的形式。
第一次显示的页面,生成的HTML表单是与当前用户令牌存储在缓存中。如果另一个用户后,页面将显示从缓存中,第一个用户CSRF令牌。当提交表单时,牌不匹配,则抛出一个错误。
我们怎样才能解决这个问题,因为它似乎是合法的在缓存中存储表单?就业形式不依赖于用户,并为当前用户不会改变任何事。在这种情况下,没有CSRF保护是必要的,我们完全可以删除CSRF令牌:
/ /插件/ sfJobeetJob / lib /形式/ JobeetJobForm.class.php类JobeetJobForm扩展BaseJobeetJobForm{公共函数__construct(BaseObject美元的对象=零,选择美元=数组(),CSRFSecret美元=零){父:__construct(美元的对象,选择美元,假);}/ /……}
做这个改变后,清除缓存和重试上面的场景一样证明现在是否按预期运行。
相同的配置必须应用于语言形式,因为它包含在布局和将存储在缓存中。作为默认sfLanguageForm
使用,而不是创建一个新的类,去除CSRF令牌,让我们的行动和组件吗sfJobeetLanguage
模块:
/ /插件/ sfJobeetJob /模块/ sfJobeetLanguage /行动/ components.class.php类sfJobeetLanguageComponents扩展sfComponents{公共函数executeLanguage(sfWebRequest美元的请求){这个美元- >形式=新sfFormLanguage(这个美元- >getUser(),数组(“语言”= >数组(“en”,“fr”)));设置(这个美元- >形式(这个美元- >形式- >getCSRFFieldName()]);}}/ /插件/ sfJobeetJob /模块/ sfJobeetLanguage /行动/ actions.class.php类sfJobeetLanguageActions扩展sfActions{公共函数executeChangeLanguage(sfWebRequest美元的请求){美元的形式=新sfFormLanguage(这个美元- >getUser(),数组(“语言”= >数组(“en”,“fr”)));设置(美元的形式(这个美元- >形式- >getCSRFFieldName()]);/ /……}}
的getCSRFFieldName ()
返回字段的名称包含CSRF的令牌。通过取消这个字段,删除小部件和相关的验证器。
删除缓存
每次用户帖子和激活工作,必须刷新首页列出新工作。
当我们不需要工作实时出现在主页上,最好的策略是降低缓存生命时间可接受的东西:
#插件/ sfJobeetJob /模块/ sfJobeetJob / config /缓存。yml指数:启用:一生:600
而不是默认的配置,有一天,主页的缓存会自动删除每十分钟。
但如果你想尽快更新主页用户激活一个新工作,编辑executePublish ()
的方法sfJobeetJob
模块添加手动清除缓存:
/ /插件/ sfJobeetJob /模块/ sfJobeetJob /行动/ actions.class.php公共函数executePublish(sfWebRequest美元的请求){美元的请求- >checkCSRFProtection();美元的工作=这个美元- >getRoute()- >getObject();美元的工作- >发布();如果(美元的缓存=这个美元- >getContext()- >getViewCacheManager()){美元的缓存- >删除(“sfJobeetJob /索引sf_culture = * ?”);美元的缓存- >删除(“sfJobeetCategory /显示? id =”。美元的工作- >getJobeetCategory()- >getId());}这个美元- >getUser()- >setFlash(“通知”,sprintf(现在你的工作是网络% s天。”,sfConfig::得到(“app_active_days”)));这个美元- >重定向(这个美元- >generateUrl(“job_show_user”,美元的工作));}
缓存管理的sfViewCacheManager
类。的remove ()
方法删除缓存与内部URI相关联。删除缓存的所有可能的参数变量,使用*
的价值。的sf_culture = *
我们使用上面的代码意味着symfony将删除缓存的英语和法语的主页。ob娱乐下载
缓存管理器零
当缓存是禁用的,我们有包装的缓存删除如果
块。
的
sfContext
类的
sfContext
对象包含symfony核心对象的引用的请求,响应,用户,等ob娱乐下载等。作为sfContext
就像一个单例,您可以使用sfContext: getInstance ()
声明在任何地方得到它,然后可以访问任何symfony核心对象:ob娱乐下载$ user= sfContext::getInstance()- >getUser();您甚至可以使用
sfContext
作为一个注册表和添加自己的对象使用设置()
方法。需要一个名称和一个对象作为参数get ()
方法可以稍后用于检索对象的名字:sfContext::getInstance()- >集(“工作”,美元的工作);美元的工作= sfContext::getInstance()- >得到(“工作”);
测试缓存
我们已经做了很多修改缓存配置,这是你需要的工作
模块:
#插件/ sfJobeetJob /模块/ sfJobeetJob / config /缓存。yml指数:启用:新:启用:在所有:with_layout:真的
在开始之前,我们需要改变配置的测试
环境启用缓存层:
#应用/前端/ config /设置。yml测试:.settings: error_reporting: < ?php echo ((E_ALL |代码)^ E_NOTICE)。“\ n”? >缓存:web_debug:从etag:
让我们测试工作创建页面:
/ /测试/功能/前端/ jobActionsTest.php美元的浏览器- >信息(“7 -就业页面”)- >得到(“/ fr /”)- >与(“view_cache”)- >isCached(真正的,真正的)- >createJob(数组(category_id添加的= >美元的浏览器- >getProgrammingCategory()- >getId()),真正的)- >得到(“/ fr /”)- >与(“view_cache”)- >isCached(真正的,真正的)- >与(“响应”)- >checkElement(”。category_programming .more_jobs”,/ 29的);
的view_cache
试验机是用来测试缓存。的isCached ()
方法取两个布尔值:
- 是否缓存中的页面必须
- 是否与布局不缓存
即使所有工具提供的功能测试框架,有时容易在浏览器中诊断问题。很容易完成。创建一个控制器
测试
环境。日志存储在日志/ frontend_test.log
也可以是非常有用的。
明天见
像许多其他symfony特性,sob娱乐下载ymfony缓存sub-framework非常灵活,允许开发人员配置缓存以非常细粒度的水平。
明天,我们将讨论应用程序生命周期的最后一步:部署到生产服务器。
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
欢呼和感谢另一个非常好的教程!
丹尼尔
这不是错了吗?如果有参数,不该symfony创建不同的缓存文件不同的输入数据集,从而允许开发ob娱乐下载人员提供缓存等航线/显示/页面/:鼻涕虫”
得到参数是这样的:
其他? foo = bar&something =
然而,随着上下文相关的应用程序中,有一个快速的方法来删除缓存在另一个应用程序,而不必做::switchTo () ?喜欢创造一些管理员发电机为出版公共行政的吗?