<?php /** * 用于获取远程文件并缓存 * CurlCache v1.0 * Created by cr. * Date: 2015/12/03 */ //namespace vendor\core; class CurlCache { /** * 请求地址 * @var string */ protected $url; /** * 缓存生存期 * @var int */ protected $expires; /** * 请求超时 * @var int */ protected $timeOut; /** * 是否开启缓存 * @var int */ protected $cacheEna; /** * 是否显示debug信息 * @var bool */ protected $debug; /** * 其他不用配置的内部属性 */ protected $path; protected $filename; protected $curlData; protected $curlHeader; protected $curlError; protected $cacheData; public $data; /** * CurlCache constructor. * @param int $expires * @param int $timeOut * @param bool|true $cacheEna * @param bool|false $debug */ public function __construct($expires=3600, $timeOut=30, $cacheEna=true, $debug=false) { $this->expires=$expires; $this->timeOut=$timeOut; $this->cacheEna=$cacheEna; $this->debug=$debug; } /** * 检测并创建目录 * @return bool */ public function mkdirs(){ if(is_dir($this->path)){ return true; }else{ return mkdir($this->path, 777, true); } } /** * 设置缓存文件相关信息 * @param $url */ public function setCacheFileInfo($url){ $this->url=$url; $this->path=dirname(__FILE__).'/cache/'; $this->filename=$this->url?md5($this->url):'null'; } /** * 主方法,取得数据 * @param $url * @return bool|string */ public function get($url){ $this->setCacheFileInfo($url); if($this->cacheEna) $this->data=unserialize($this->getCache($url)); if(!$this->data) $this->data=$this->curlGet($url); if($this->data && $this->cacheEna) $this->setCache($url,serialize($this->data)); return $this->data->contents; } /** * curl GET 请求数据 * @param $url * @return string */ public function curlGet($url){ if($this->debug && $url=='') echo('请求URL为空,请检查'); $return=new stdClass(); $ch = curl_init (); curl_setopt($ch, CURLOPT_URL,$url ); curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeOut); curl_setopt($ch, CURLOPT_HEADER, 0 ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $this->curlData=curl_exec($ch); $this->curlHeader=curl_getinfo($ch); $this->curlError=curl_error($ch); $return->header=$this->curlHeader; $return->contents=$this->curlData; curl_close($ch); if((!$this->curlData || $this->curlHeader['http_code'] != '200') && $this->debug ) echo '请求失败,错误信息:'.$this->curlError; else return $return; } /** * 取得缓存数据 * @param $url * @return bool|string */ public function getCache($url){ $this->setCacheFileInfo($url); if(file_exists($this->path.$this->filename)){ if(time() - filemtime($this->path.$this->filename) < $this->expires) $this->cacheData=file_get_contents($this->path.$this->filename); else if($this->debug) echo '缓存文件已过期'; if($this->cacheData) return $this->cacheData;else if($this->debug) echo '缓存文件内容为空'; }else{ //if($this->debug) echo '缓存文件不存在'; return false; } } /** * 写入缓存数据 * @param $url * @param $data */ public function setCache($url,$data){ $this->setCacheFileInfo($url); if(!$this->mkdirs() && $this->debug) echo('创建缓存目录失败:'.$this->path); if($data){ if(!file_put_contents($this->path.$this->filename,$data) && $this->debug){ echo '写入缓存失败 File:'.$this->path.$this->filename; } }else{ if($this->debug) echo '数据为空,不写入缓存'; } } }