php网站数据缓存

Php 2019-12-01 阅读 52 评论 0

缓存的作用

有很多工具可以提高网站的访问速度和性能。比如eAccelerator 和 APC,然而,这些都需要在网站的服务器上安装,比较麻烦。

使用PHP编码,我们可以很方便地缓存一个网页,对于那些使用数据库驱动或者是高频率查询数据库的网站,是非常有帮助的。

Output Control 函数

Output Control 函数可以实现缓存文件的效果,利用ob_start(打开输出控制缓冲),ob_get_contents(返回输出缓冲区的内容),将请求的输出结果,保存到缓存文件,下一次请求的时候,如果缓存文件存在并且不过期,则返回缓存文件保存的内容。减少数据查询等操作,提高访问效率。

简单的示例

首先我们需要建立一个文件夹,作为存储缓存文件使用,确保拥有读/写权限。

下一步是创建一个cache.php文件,代码如下:

<?php
// 缓存文件的有效时间,秒
$cache_expires = 3600;

// 生成缓存文件的目录
$cache_folder = "/home/usr/www/cache/";

// 检查缓存文件是否有效
function is_cached($file) {
    global $cache_folder, $cache_expires;
    $cachefile = $cache_folder . $file;
    $cachefile_created = (file_exists($cachefile)) ? @filemtime($cachefile) : 0;
    return ((time() - $cache_expires) < $cachefile_created);
}

// 读取缓存文件的内容
function read_cache($file) {
    global $cache_folder;
    $cachefile = $cache_folder . $file;
    return file_get_contents($cachefile);
}

// 写入内容到缓存文件
function write_cache($file, $out) {
    global $cache_folder;
    $cachefile = $cache_folder . $file;
    $fp = fopen($cachefile, 'w');
    fwrite($fp, $out);
    fclose($fp);
}

// 开始:用请求地址的 md5 作为文件名
$cache_file = md5($_SERVER['REQUEST_URI']) . ".html";

// 先检查缓存文件是否已生成,并且有效,如果为 true,直接读取内容,并完成此请求、退出
if (is_cached($cache_file)) {
    echo read_cache($cache_file);
    exit();
}

// 打开输出控制缓冲
ob_start();

现在,在你想做任何事情之前,应该先include  cache.php文件,因为如果此页面被缓存了,我们不用将做任何事情,直接将内容输出即可。如果在检查缓存文件之前,去include其他文件,或者连接数据库,这些缓存文件将没有什么用处。

最后,创建一个cache_footer.php,包含了一下代码:

<?php
// 获取输出缓冲区的内容,也就是待缓存的内容
$cache_contents = ob_get_contents();

// 保存到缓存文件,以便下次使用
write_cache($cache_file, $cache_contents);
?>

你应当在php的最后一行,包含这个文件,它将能缓存这个文件。

将这2个文件组合起来,大概是这样子:

<?php
// 加载缓存处理
include("cache.php");

// 链接数据库
include("config.php");
mysql_connect($db_host, $db_username, $db_password) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());
?>
<html>
<body>
<h1>Articles</h1>
<?php
// 执行一些数据库查询
$q = mysql_query("SELECT * FROM articles ORDER BY id");
while ($r = mysql_fetch_array($q)) {
  echo $r['title'];
}
?>
</body>
</html>
<?php
// 保存到缓存
include("cache_footer.php");
?>
最后更新 2019-12-01