前言
目前项目访问量较高,数据量比较大,更新不频繁
突然想到使用Redis+HTML直接返回HTML静态页,如果使用Redis存储Html字符串会出现Redis中bigKey的问题。
所以使用Redis String过期key-value + Html文件策略,使一个HTML文件对应的Key存活5分钟,五分钟后出现访问重新生成新的Html静态页。
遇到问题,执行完成的PHP代码无法获取,截获路由使用file_get_content(url)重新请求路由会出现连续请求两次的情况,如果大量的key过期会给nginx和PHPCGI增加压力甚至造成宕机。
使用PHP ob_xxxx系列函数目前可以解决这样的问题
一、OB缓存
1、首先我们介绍一下OB缓存:
ob是output buffering的简称,翻译过来--输出缓冲区。
PHP缓冲区是可以通过php.ini中的output_buffering控制的。其默认值是off,可以设置为on来打开。打来后,即便程序中没有用ob函数,实际上代码也是使用了缓冲区的。另外,无论php.ini中output_buffering怎么设置,cli模式下的php ob始终默认是关闭的。
2、OB的原则
如果缓存打开,则echo等数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器。(这是不是就是我们要的数据)
二、OB使用
ob_start :打开输出缓冲区(在项目入口处使用吧 避免head等获取不到)
当缓冲区打开时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。如果想输出缓冲区的内容,可以使用ob_end_flush()(发送内容到浏览器并关闭)或flush()(发送内容到浏览器)输出缓冲区的内容。
ob_get_contents :返回缓冲区的内容(这就是需要的HTML字符串)
返回当前缓冲区中的内容,如果输出缓冲区没有打开,则是 false 。
ob_get_length:返回缓冲区的长度(好像没啥用)
返回当前缓冲区中的长度,如果输出缓冲区没有打开,则是 false 。
ob_end_flush :返回缓冲区的内容到浏览器(写在文件尾,避免脚部信息缺失)
返回缓冲区的内容到浏览器,并且关闭输出缓冲区(这个会关闭缓冲区)
ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区(直接删除不返回)
上点代码吧要不显得不正经 非常简单的操作
<?php //打开缓冲区 ob_start(); //执行代码 各种PHP都行 include_once('./xxxxx.php'); if(asaa){ } ** * * * * * * * * * ** include_once(AAAAssss.'/foot.php'); //判断是否需要缓存 if($Cache){ //获取字符串 $contentHtml = ob_get_contents(); //设置有效期为300秒的键值 $redis->setex('rediskey', 300, '1'); //把字符串保存成HTML文件 file_put_contents('../html/aaabbtest.html', $contentHtml); } //最后别忘了输出 否则浏览器一点信息都没有 ob_end_flush(); ?>