php页面静态化实现方案
2017-01-09 本文已影响358人
Stone_Zhuo
对内容不经常变化的面向用户的页面进行静态化处理可以显著提升页面的响应速度,同时还可以减少对服务器系统资源的占用并降低数据库服务器的压力。在php
项目中如何实现页面静态化呢?
实现原理
通过对页面内容的缓存来取代数据库查询和数据处理。
实现步骤
- 请求页面时判断页面缓存是否存在,如果存在是否过期。
- 如果页面缓存存在并且没有过期则直接将缓存内容返回给浏览器。
- 如果页面缓存不存在或者已经过期,则进行正常的数据库查询及页面渲染,同时将页面缓存起来。
示例代码
/**
* 以下代码放置于脚本逻辑开始之前。
* 这段代码包含的配置信息如$page_static_config可能是从配置文件中读取的。
* 代码中的$url_info数组元素的具体值可能是通过程序去获取的而不是写死,以此可以提高代码的可移植性和复用度。
*/
$page_static_config = [ // 页面静态化配置
'cache_ext' => '.html', // 缓存文件后缀
'cache_time' => 21600, // 缓存保留时间
'cache_folder' => '../tmp/cache/static/' // 静态文件放置的文件夹
];
$url_info = [ // 页面地址参数
'host' => $_SERVER['HTTP_HOST'],
'constroller' => 'index',
'action' => 'index',
'param' => '/12/34'
];
$this_url = 'http://'.$url_info['host'].'/'.$url_info['controller'].'/'.$url_info['action'].$url_info['param']; // 唯一标识当前访问的地址
$cache_file = $page_static_config['cache_folder'].md5($this_url).$page_static_config['cache_ext']; // 缓存文件名
if (file_exists($cache_file) && time() - $page_static_config['cache_time'] < filemtime($cache_file)) { // 缓存文件存在并且没有过期
ob_start('ob_gzhandler'); // 打开输出控制缓冲,参数`ob_gzhandler`是一个回调函数,用来压缩输出缓冲区中的内容。
readfile($cache_file); // 读取缓存的静态文件内容并写入输出缓冲。
ob_end_flush(); // 送出输出缓冲区内容并关闭缓冲。
exit;
}
// 当缓存静态文件不存在时需要进行正常的数据查询和整理并渲染页面,同时将页面内容保存为缓存文件以实现页面静态化。
ob_start('ob_gzhandler');
$this->set('page_static_config', $page_static_config);
$this->set('cache_file', $cache_file);
/**
* 以下代码放置于所有代码之后,可以简单理解为放在</html>标签之后。
* 所有要发送给浏览器并要缓存的内容都在此段代码之前已经送出到输出缓冲区。
*/
if (isset($cache_file)) { // 判断是否存在缓存文件的变量定义,这样这段代码可以放在公用代码段中,在被引用的页面判断是否有页面静态化的需要。
if (!is_dir($page_static_config['cache_folder'])) { // 判断缓存文件夹是否存在,不存在则需要创建。
mkdir($page_static_config['cache_folder']);
}
$file_handler = fopen($cache_file, 'w'); // 以可写的方式打开缓存文件。
fwrite($file_handler, ob_get_contents()); // 获取输出缓冲区的内容并写入缓存文件。
fclose($file_handler); // 关闭被打开的文件资源句柄。
ob_end_flush(); // 送出输出缓冲区内容并关闭缓冲。
}
补充说明
-
ob_start()
是php
输出控制函数,此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。 -
ob_end_flush()
是php
输出控制函数,这个函数将送出最顶层缓冲区的内容(如果里边有内容的话),并关闭缓冲区。如果想进一步处理缓冲区中的内容,必须在ob_end_flush()之前调用 ob_get_contents(),因为在调用ob_end_flush()后缓冲区内容被丢弃。 -
$this->set()
是大多数模板引擎支持的模板变量赋值方式,目的是将变量延伸到模板中去使用。 -
ob_get_contents()
是php
输出控制函数,此函数只是得到输出缓冲区的内容,但不清除它。
本文首发于公众号:programmer_cc,转载请注明出处。
微信公众号.jpg