原生PHP缓存Html 待PHP执行完成后获取Html内容 PHP内置缓存ob_xxx函数实现页面静态化 获取PHP文件输出的内容

前言

目前项目访问量较高,数据量比较大,更新不频繁

突然想到使用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();

?>

上一篇:OculusVR Compositor layers学习总结


下一篇:字符串intern机制 | 字符串驻留 | Python源码