(一)、缓存的三要素
1、命中率
命中率:请求次数与缓存返回正确结果的比例,比例越高,缓存命中率越高;
2、缓存更新策略
总结以下几种
· FIFO 先进先出策略;
· LFU 最少用,最先清除策略;
· LRU 最近最少使用最先清除策略;
3、缓存的最大数据量
缓存中能处理元素的最大个数或者所能使用的最大存储空间。
(二)、PHP 文件缓存
php文件缓存指将缓存数据存入文件系统,相比内存,硬盘空间大而廉价,并且简单可靠。
代码可参考如下:
<?php
class Cache{
/**
* 渲染数据
*
* @var array
*/
public $value=[];
/**
* 配置列表
*
* @var array
*/
public $arrayConfig=[
//是否开启缓存
'cache_html'=>false,
//缓存目录
'cache_dir'=>'',
//缓存目录后缀
'suffix_cache'=>'',
//模板目录
'templateDir'=>'',
//模板文件后缀
'suffix'=>'',
//缓存有效期
'cache_time'=>''
];
//返回编译文件名,存在路径处理
public function path()
{
return $this->cache_file=$this->arrayConfig['cache_dir'].$this->file.$this->arrayConfig['suffix_cache'];
}
//开始编译
public function complie()
{
//获取缓冲区内容
$this->message=ob_get_contents();
//保存内容
@file_put_contents($this->path(),$this->message);
}
/**
* 显示模板
*
* @param string 模板名
* @return void
*/
public function show($file)
{
$this->file=$file;
//模板文件路径
$PIG_TPL_FILE=$this->arrayConfig['templateDir'].$file.$this->arrayConfig['suffix'];
//判断文件是否过期
if(is_file($this->path()))
{
$old=$_SERVER['REQUEST_TIME']-filemtime($this->path())>=$this->arrayConfig['cache_time']?1:0;
}
else
{
$old=0;
}
//静态编译开启
if($this->arrayConfig['cache_html'])
{
//静态文件存在并且未过期
if(is_file($this->path())&&!$old)
{
readfile($this->path());
}
else
{
if(is_file($PIG_TPL_FILE))
{
ob_start();
extract($this->value);
include($PIG_TPL_FILE);
$this->complie();
}
else
{
die('找不到模板文件!');
}
}
}
//静态编译关闭
else
{
if(is_file($PIG_TPL_FILE))
{
extract($this->value);
include($PIG_TPL_FILE);
}
else
{
die('找不到文件!');
}
}
//内容输出
ob_flush();
flush();
}
}
(三)、PHP程序编译加速
PHP通常是多进程服务规则。所以程序的规则多半是 调用-运行-清理 但是问题的关键在于每次都需要php的解析器翻译php语言编程opcode
在进行编译。如何解决这个重复的问题 也是加载网页效率的关键
目前可用的php程序缓存可参考 opcache 安装过程不赘述。描述一下配置信息
[opcache]
zend_extension=/Applications/MxSrvs/bin/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
; 启动操作码缓存
opcache.enable=0
; 针对支持CLI版本PHP启动操作码缓存 一般被用来测试和调试
opcache.enable_cli=1
; 共享内存大小,单位为MB
opcache.memory_consumption=128
; 存储临时字符串缓存大小,单位为MB,PHP5.3.0以前会忽略此项配置
opcache.interned_strings_buffer=8
; 缓存文件数最大限制,命中率不到100%,可以试着提高这个值
opcache.max_accelerated_files=4000
; 一定时间内检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 单位为秒
opcache.revalidate_freq=60
; 开启快速停止续发事件,依赖于Zend引擎的内存管理模块,一次释放全部请求变量的内存,而不是依次释放内存块
opcache.fast_shutdown=1
;启用检查 PHP 脚本存在性和可读性的功能,无论文件是否已经被缓存,都会检查操作码缓存,可以提升性能。 但是如果禁用了 opcache.validate_timestamps选项, 可能存在返回过时数据的风险。
opcache.enable_file_override=1
利用VLD查看opcache的命中和效率
git clone https://github.com/derickr/vld.git
cd vld
phpize
./configure
make && make install
具体怎么使用可自行百度;
(四)、客户端缓存
Expires :过期时间
在php脚本中加入过期时间头,当网站再次被加载时,查看net 有明显 cache from disk 标识
ps : 这里的过期时间未 格林威治时间 。 例 Expires : Fri ,30 Oct 1998 14:19:41 GMT
Cache-Control : 缓存控制
max-age: 缓存过期时间, 通常为未来的某个时间段对应的时间戳
no-cache : 强制每次请求发送给服务器
no-store : 禁止缓存保留副本
must-revalidate :检查文件是否新鲜
Last-Modified :最后修改时间
加入此请求头,客户端第二次请求时,会传送一个If-Modified-Since的请求头,验证在此之间是否发生文档修改
如何利用客户端缓存
· 图片启用 cache-control :max-age 给一个很长的时间;
· 定期更新的部分设置一个合理的 max-age 时间;
· 尽量避免post ,post 数据服务器一般不会缓存;
· 不要在url 中加入任何敏感信息;
php如何设置当前页面缓存
<?php
//设置页面有效期24小时,请求时检查新鲜度
header('Cache-Control:max-age=86400,must-revalidate');
//文档更新时间
header('Last-Modified:'.gmdate('D,d M Y H:i:s',time()+'86400').'GMT');
//过期时间
header('Expires:'.gmdate('D,d M Y H:i:s',time()+'86400').'GMT');
//三者可共用,也可以选择一种缓存策略来使用