动态语言的并发处理

title: ThinkPHP5 Db类源码分析
date: 2019-05-28 21:13:56
comments: true #是否可评论
toc: true #是否显示文章目录
categories: #分类
- PHP
- 框架
- ThinkPHP
tags: [框架源码,ThinkPHP,数据库,DB,笔记]

动态语言静态化

什么是动态语言静态化

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

对实时性要求不高的页面才可以做静态化

为什么要静态化

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

访问量大时可能会造成CPU负载过高,数据库服务器压力过大

静态化可以减轻逻辑处理的压力,降低数据库服务器的查询压力

静态化的实现方式

使用模板引擎

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 缓存目录
$smarty -> cache_dir = $ROOT."/cache";

// 是否开启缓存
$smarty -> caching = true;

// 缓存时间
$smarty -> cache_lifetime = "3600";

// 输出模板
$smarty -> dispaly(string template[,string cache_id[,string compild_id]]);

// 清除所有缓存
$smarty -> clear_all_cache();

// 清除指定缓存
$smarty -> clear_cache('file.html');

// 清除同一个模板下指定缓存号的缓存
$smarty -> clear_cache('article.html',$art_id);

利用ob系列函数

ob_start() : 打开输出控制缓冲
ob_get_contents() : 返回输出缓冲区内容
ob_clean() : 清空输出缓冲区
ob_end_flush() : 冲刷出(送出)输出缓冲区内容并关闭缓冲

1
2
3
4
5
6
ob_start();   //打开输出控制缓冲
<输出到页面的HTML代码>
ob_get_contents(); //返回输出缓冲区内容

ob_end_flush(); //冲刷出(送出)输出缓冲区内容并关闭缓冲
fopen(); //写入

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

使用filemtime函数,可以判断文件内容的修改时间,可用于判断是否过期

PHP基于ob函数实现静态化代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
// PHP 静态化 ob函数
// 缓存文件名
$cache_name = md5(__FILE__)."html";

// 缓存过期时间
$cache_lifetime = 3600;
// 如果缓存文件存在,并且文件修改时间小于等于缓存文件修改时间,并且没有过期
if(file_exists($cache_name) && filemtime(__FILE__) <= filemtime($cache_name) && filemtime($cache_name) + $cache_lifetime >= time()){
echo "输出缓存";
include $cache_name;
exit();
}
echo "未输出缓存";
ob_start();
?>
<h1>Ob 缓存DEMO</h1>
<?php
$content = ob_get_contents();
// var_dump($content);
ob_end_flush();

$handle = fopen($cache_name,"w");
fwrite($handle,$content);
fclose($handle);
?>