一个超简单的 PHP 文件缓存方案

这是一个超级简单的文件本地缓存方案。主要为了避免大量请(tou)求(yong)同一接口导致服务器被封 IP。

逻辑也非常简单:本地有文件,而且不过期,就读取本地文件;如果本地没有,或者文件过期了,就从 url 里面再获取一份。

最上面设置了跨域标志,最下面是 jsonp 的输出。

其实本来想加上 Memcache 的,可惜并不会用。就这样吧。

<?php
header('Content-type: application/json');
header('Access-Control-Allow-Origin: *');
$jinyu121_file="path.to.your.cache.file.or.just.a.filename";
$jinyu121_url="url.to.the.api";
$jinyu121_timeout=3600;
$jinyu121_callback=false;
$newfile=false;
$content="";
// 如果不存在缓存文件,就新建一个
if (!file_exists($jinyu121_file)){
    $newfile=true;
}else{
    // 如果缓存文件过期,就删除
    if ((time()-filemtime($jinyu121_file))>=$jinyu121_timeout){
        @unlink ($jinyu121_file);
        $newfile=true;
    }
}
if($newfile){
    // 使用 curl 比 file_get_contents 速度快,但是有些主机没有开启 curl 库
    if (function_exists('curl_init')){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $jinyu121_url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        $content = curl_exec($ch);
        curl_close($ch);
    }else {
        $content=file_get_contents($jinyu121_url);
    }
    file_put_contents($jinyu121_file, $content);
}else{
    $content=file_get_contents($jinyu121_file);
}
// 是否使用 callback
if (isset($_GET["callback"])){
    echo $_GET["callback"]."(".$content.")";
}else {
    echo $content;
}

其实,对于一个日平均访问量不超过 10 的博客来说……上面这些东西都可以忽略了吧。

但写博客的意义不就在于折腾么?

留下评论