会飞的鱼

2021
分享我的互联网新知
首页 » 开发日常 » 分享一个 PHP 文件缓存类

分享一个 PHP 文件缓存类

最近开始写星辰广告联盟,核心部分基本完成,前端展示测试时发现动态调用时curl总占用一点点时间,0.01秒作用,页面显示有点小卡,可能是服务器比较破吧,为了加快速度,就需要一个缓存加载,百度后发现有个缓存类还行, 简单修改下php7的兼容就可用,调用成功演示地址:https://qrcode.quyuxi.com/,代码分享下吧。

final class CFileCache
{
    /**
     * 缓存目录
     * @var string
     */
    private static $msCachePath  = null;
    /**
     * 默认缓存失效时间(1小时)
     * @var int
     */
    const miEXPIRE = 3600;


    /**
     * 构造

     * self::$msCachePath 缓存目录为共享目录
     * @param string $sCachePath
     */
    function __construct($sCachePath='./cache/')
    {
        if (is_null(self::$msCachePath))
            self::$msCachePath = $sCachePath;
    }

    /**
     * 读取缓存

     * 返回: 缓存内容,字符串或数组;缓存为空或过期返回null
     * @param string $sKey 缓存键值(无需做md5())
     * @return string | null
     * @access public
     */
    public function get($sKey)
    {
        if(empty($sKey))
            return false;

        $sFile  = self::getFileName($sKey);
        if(!file_exists($sFile))
            return null;
        else
        {
            $handle = fopen($sFile,'rb');
            if (intval(fgets($handle)) > time())//检查时间戳
            {	//未失效期,取出数据
                $sData = fread($handle, filesize($sFile));
                fclose($handle);
                return unserialize($sData);
            }
            else
            {	//已经失效期
                fclose($handle);
                return null;
            }
        }
    }

    /**
     * 写入缓存
     *
     * @param string $sKey 缓存键值
     * @param mixed $mVal 需要保存的对象
     * @param int $iExpire 失效时间
     * @return bool
     * @access public
     */
    public function set($sKey, $mVal, $iExpire=null)
    {
        if(empty($sKey))
            return false;

        $sFile = self::getFileName($sKey);
        if (!file_exists(dirname($sFile)))
            if (!self::is_mkdir(dirname($sFile)))
                return false;

        $aBuf = array();
        $aBuf[] = time() + ((empty($iExpire)) ? self::miEXPIRE : intval($iExpire));
        $aBuf[] = serialize($mVal);
        /*写入文件操作*/
        $handle = fopen($sFile,'wb');
        fwrite($handle, implode("\n", $aBuf));
        fclose($handle);
        return true;
    }

    /**
     * 删除指定的缓存键值
     *
     * @param string $sKey 缓存键值
     * @return bool
     */
    public function del($sKey)
    {
        if(empty($sKey))
            return false;
        else
        {
            @unlink(self::getFileName($sKey));
            return true;
        }
    }

    /**
     * 获取缓存文件全路径

     * 返回: 缓存文件全路径

     * $sKey的值会被转换成md5(),并分解为3级目录进行访问
     * @param string $sKey 缓存键
     * @return string
     * @access protected
     */
    private static function getFileName($sKey)
    {
        if(empty($sKey))
            return false;

        $key_md5 = md5($sKey);
        $aFileName = array();
        $aFileName[]  = rtrim(self::$msCachePath,'/');
        $aFileName[]  = $key_md5{0} . $key_md5{1};
        $aFileName[]  = $key_md5{2} . $key_md5{3};
        $aFileName[]  = $key_md5{4} . $key_md5{5};
        $aFileName[]  = $key_md5;
        return implode('/', $aFileName);
    }

    /**
     * 创建目录

     *
     * @param string $sDir
     * @return bool
     */
    private static function is_mkdir($sDir='')
    {
        if(empty($sDir))
            return false;

        /*如果无法创建缓存目录,让系统直接抛出错误提示*/
        if(!mkdir($sDir, 0755,true))
            return false;
        else
            return true;
    }
}
调用:
require dirname(__FILE__)."/cache.php";
    $oFC = new CFileCache('./cache/');
    //全部广告
    $sKey = 'cps_all';
    $cps_all = $oFC->get($sKey); //取得缓存
    if(is_null($cps_all)){
        //逻辑代码 仅供参考
        $data =[
            'uu'=>'666',
        ];
        $ret = go_curl('https://www.xmspace.net/service.php','POST',$data);
        $res = json_decode($ret, true);
        //逻辑代码 仅供参考
       
        $oFC->set($sKey, $res['data'], 36000); //缓存不存在创建缓存36000 10小时
    }

文章如无特别注明均为原创! 作者: crx349, 转载或复制请以 超链接形式 并注明出处 crx349博客-智能互联分享博客
原文地址《 分享一个 PHP 文件缓存类》发布于2021-6-15

分享到:
打赏

评论

游客

看不清楚?点图切换
切换注册

登录

您也可以使用第三方帐号快捷登录

切换登录

注册