企业级 PHP 高并发解决方案 0x06 动态语言静态化

架构352 字

什么是动态语言静态化

将现有 PHP 等动态语言的逻辑代码生成为静态HTML 文件,用户访问动态脚本重定向到静态 HTML 文件的过程。

如果页面中的的数据一直都在变化,那么不建议使用静态化。

为什么要静态化

动态脚本通常会做逻辑运算和数据查询,访问量越大,服务器压力越大。

访问量大的时候可能造成 CPU 负载过高,数据服务器压力过大,静态化可以减轻逻辑处理能力,降低数据库服务器的查询压力。

静态化的实现方式

使用模板引擎

可以使用 Smarty 的缓存机制生成静态 HTML 缓存文件。

$smarty->cache_dir = $ROOT.'/cache'; //缓存目录
$smarty->caching = true;                //是否开启缓存
$smarty->cache_lifetime = '3600';    //缓存时间 
$smarty->display(strign template [,string cache_id[, strign compile_id]]);

如果开启了缓存,Smarty 会自动的生成 HTML 缓存文件。

$smarty->clear_all_cache();            //清除所有缓存
$smarty->clear_cache('file.html');    //清除指定缓存
$smarty->clear_cache('article,html', $cache_id) //清除一同模板下的指定缓存号的缓存。

利用 OB 系列函数

  • ob_start():打开输出控制缓冲
  • ob_get_contents():返回输出缓冲区的内容
  • ob_clean():清空输出缓冲区
  • ob_end_flush():冲刷出(送出)输出缓冲区内容并且关闭缓冲
ob_start();
输出到页面的 HTML 代码
ob_get_contents();
ob_end_flush();
fopen()写入

可以使用 filectime 函数 判断文件的 inode 修改时间,判断是否过期。

<?php
$cache_name = md5(__FILE__).'html';
$cache_lifetime = 3600;

if ( filectime(__FILE__) <= filectime($cache_name) file_exists($cache_name) && filectime($cache_name) + $cache_lifetime > time()) {
    //判断 PHP 文件修改时间
    //判断是否存在缓存
    //判断是否过期
    include $cache_name;
    exit;
}
ob_start();
?>
<b> This is my Script</b>
<?php
$content = ob_get_contents();    
$ob_end_flush();
$handle = fopen($cache_name, 'w');
fwrite($handle, $content);
fclose($handle);
?>
maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见