这是一个超级简单的文件本地缓存方案。主要为了避免大量请(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的博客来说……上面这些东西都可以忽略了吧。
但写博客的意义不就在于折腾么?
发表回复