《PHP实战:简介PHP的Yii框架中缓存的一些高级用法》要点:
本文介绍了PHP实战:简介PHP的Yii框架中缓存的一些高级用法,希望对您有用。如果有疑问,可以联系我们。
相关主题:YII框架
PHP实战页面缓存
页面缓存指的是在服务器端缓存整个页面的内容.随后当同一个页面被请求时,内容将从缓存中取出,而不是重新生成.
PHP实战页面缓存由 yii\filters\PageCache 类提供支持,该类是一个过滤器.它可以像这样在控制器类中使用:
PHP实战
public function behaviors()
{
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index'],
'duration' => 60,
'variations' => [
\Yii::$app->language,
],
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM post',
],
],
];
}
PHP实战上述代码表示页面缓存只在 index 操作时启用,页面内容最多被缓存 60 秒,会随着当前应用的语言更改而变化.如果文章总数发生变化则缓存的页面会失效.
PHP实战如你所见,页面缓存和片段缓存极其相似.它们都支持 duration,dependencies,variations 和 enabled 配置选项.它们的主要区别是页面缓存是由过滤器实现,而片段缓存则是一个小部件.
PHP实战你可以在使用页面缓存的同时,使用片段缓存和动态内容.
PHP实战HTTP 缓存
PHP实战除了服务器端缓存外, Web 应用还可以利用客户端缓存去节省相同页面内容的生成和传输时间.
PHP实战通过配置 yii\filters\HttpCache 过滤器,控制器操作渲染的内容就能缓存在客户端.yii\filters\HttpCache 过滤器仅对 GET 和 HEAD 请求生效,它能为这些请求设置三种与缓存有关的 HTTP 头.
PHP实战Last-Modified 头
PHP实战Last-Modified 头使用时间戳标明页面自上次客户端缓存后是否被修改过.
PHP实战通过配置 yii\filters\HttpCache::lastModified 属性向客户端发送 Last-Modified 头.该属性的值应该为 PHP callable 类型,返回的是页面修改时的 Unix 时间戳.该 callable 的参数和返回值应该如下:
PHP实战
/**
* @param Action $action 当前处理的操作对象
* @param array $params “params” 属性的值
* @return integer 页面修改时的 Unix 时间戳
*/
function ($action, $params)
PHP实战以下是使用 Last-Modified 头的示例:
PHP实战
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
return $q->from('post')->max('updated_at');
},
],
];
}
PHP实战上述代码表明 HTTP 缓存只在 index 操作时启用.它会基于页面最后修改时间生成一个 Last-Modified HTTP 头.当浏览器第一次访问 index 页时,服务器将会生成页面并发送至客户端浏览器.之后客户端浏览器在页面没被修改期间访问该页,服务器将不会重新生成页面,浏览器会使用之前客户端缓存下来的内容.因此服务端渲染和内容传输都将省去.
PHP实战ETag 头
PHP实战“Entity Tag”(实体标签,简称 ETag)使用一个哈希值表示页面内容.如果页面被修改过,哈希值也会随之改变.通过对比客户端的哈希值和服务器端生成的哈希值,浏览器就能判断页面是否被修改过,进而决定是否应该重新传输内容.
PHP实战通过配置 yii\filters\HttpCache::etagSeed 属性向客户端发送 ETag 头.该属性的值应该为 PHP callable 类型,返回的是一段种子字符用来生成 ETag 哈希值.该 callable 的参数和返回值应该如下:
PHP实战
/**
* @param Action $action 当前处理的操作对象
* @param array $params “params” 属性的值
* @return string 一段种子字符用来生成 ETag 哈希值
*/
function ($action, $params)
PHP实战以下是使用 ETag 头的示例:
PHP实战
public function behaviors()
{
return [
[
'class' => 'yii\filters\HttpCache',
'only' => ['view'],
'etagSeed' => function ($action, $params) {
$post = $this->findModel(\Yii::$app->request->get('id'));
return serialize([$post->title, $post->content]);
},
],
];
}
PHP实战上述代码表明 HTTP 缓存只在 view 操作时启用.它会基于用户请求的标题和内容生成一个 ETag HTTP 头.当浏览器第一次访问 view 页时,服务器将会生成页面并发送至客户端浏览器.之后客户端浏览器标题和内容没被修改在期间访问该页,服务器将不会重新生成页面,浏览器会使用之前客户端缓存下来的内容.因此服务端渲染和内容传输都将省去.
PHP实战ETag 相比 Last-Modified 能实现更复杂和更精确的缓存策略.例如,当站点切换到另一个主题时可以使 ETag 失效.
PHP实战复杂的 Etag 生成种子可能会违背使用 HttpCache 的初衷而引起不必要的性能开销,因为响应每一次请求都需要重新计算 Etag.请试着找出一个最简单的表达式去触发 Etag 失效.
PHP实战注意:为了遵循 RFC 7232(HTTP 1.1 协议),如果同时配置了 ETag 和 Last-Modified 头,HttpCache 将会同时发送它们.并且如果客户端同时发送 If-None-Match 头和 If-Modified-Since 头,则只有前者会被接受.
Cache-Control 头
PHP实战Cache-Control 头指定了页面的常规缓存策略.可以通过配置 yii\filters\HttpCache::cacheControlHeader 属性发送相应的头信息.默认发送以下头:
PHP实战
Cache-Control: public, max-age=3600
PHP实战会话缓存限制器
PHP实战当页面使 session 时,PHP 将会按照 PHP.INI 中所设置的 session.cache_limiter 值自动发送一些缓存相关的 HTTP 头.这些 HTTP 头有可能会干扰你原本设置的 HttpCache 或让其失效.为了避免此问题,默认情况下 HttpCache 禁止自动发送这些头.想改变这一行为,可以配置 yii\filters\HttpCache::sessionCacheLimiter 属性.该属性接受一个字符串值,包括 public,private,private_no_expire,和 nocache.请参考 PHP 手册中的缓存限制器了解这些值的含义.
PHP实战SEO 影响
PHP实战搜索引擎趋向于遵循站点的缓存头.因为一些爬虫的抓取频率有限制,启用缓存头可以可以减少重复请求数量,增加爬虫抓取效率(译者:大意如此,但搜索引擎的排名规则不了解,好的缓存策略应该是可以为用户体验加分的).
PHP实战
《PHP实战:简介PHP的Yii框架中缓存的一些高级用法》是否对您有启发,欢迎查看更多与《PHP实战:简介PHP的Yii框架中缓存的一些高级用法》相关教程,学精学透。维易PHP学院为您提供精彩教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7016.html