• 0
  • 0

PHP文件缓存操作

2019-12-03 760 0 admin 所属分类:PHP 记录

针对于部分频繁请求,又不需要频繁更改的数据,可以考虑以缓存的形式读取。适当时机再做更新。

以文件缓存为例。

PHP缓存类实例化使用

$cache_class = \Library\Cache::getInstance();

自动加载操作  CLASS_PATH 为类存放目录(后面带目录斜杠) 

// 截取系统自动导入类
spl_autoload_register(function ($class) {
    if (strpos($class, '\\') !== false) {

        //带命名空间的外部类
        $class = str_replace("\\", "/", $class);
        $file = CLASS_PATH . $class . '.php';
        require $file;
        return true;
    }
}, true, true);

缓存类操作

$cache_class->remove('key');
$cache_class->removeAll();
$cache_class->set('key',$data);
$cache_class->get('key');


缓存类定义

<?php

namespace Library;

class Cache {

    // 类实例
    private static $instance = null;

    // 构造函数
    public function __construct() {
    }

    // 获取实例
    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new self;
        }

        return self::$instance;
    }

    /**
     * 获取
     * @param  [type]  $name [description]
     * @param  boolean $fail [description]
     * @return [type]        [description]
     */
    public function get($name, $fail = false) {
        if ($obj = $this->has($name)) {
            return unserialize($obj->data);
        } else {
            return value($fail);
        }
    }

    /**
     * 设置
     * @param [type]  $name   [description]
     * @param [type]  $data   [description]
     * @param integer $expiry [description]
     */
    public function set($name, $data, $expiry = 0) {
        $obj = new \stdClass();

        $obj->data = serialize($data);
        $obj->expiry = $expiry ? time() + $expiry : 0;
        $file = self::getFile($name);
        $dir = dirname($file);
        if (!is_dir($dir)) {
            dmkdir($dir,0777);
        }
        return (bool) file_put_contents($file, serialize($obj));
    }

    /**
     * 是否有效
     * @param  [type]  $name [description]
     * @return object        [description]
     */
    public function has($name) {
        $file = self::getFile($name);

        // 文件不存在
        if (!is_file($file)) {
            return false;
        }

        // 非对象
        $obj = unserialize(file_get_contents($file));
        if (!is_object($obj)) {
            unlink($file);
            return false;
        }

        // 超过有效期
        if ($obj->expiry && $obj->expiry < time()) {
            unlink($file);
            return false;
        }

        return $obj;
    }

    /**
     * 移除
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public function remove($name) {
        $file = self::getFile($name);
        return !is_file($file) || unlink($file);
    }

    /**
     * 移除所有
     * @return [type] [description]
     */
    public function removeAll() {
        // 缓存目录
        $dir = CACHE_PATH . 'cache/';

        if ($handle = opendir($dir)) {
            while (($file = readdir($handle)) !== false) {
                if ($file != '.' && $file != '..') {
                    unlink($dir . $file);
                }
            }
        }

        return true;
    }

    /**
     * 设置
     * @param [type] $name  [description]
     * @param [type] $value [description]
     */
    public function __set($name, $value) {
        return $this->set($name, $value);
    }

    /**
     * 获取
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public function __get($name) {
        return $this->get($name);
    }

    /**
     * 检查
     * @param  [type]  $name [description]
     * @return boolean       [description]
     */
    public function __isset($name) {
        return $this->has($name);
    }

    /**
     * 删除
     * @param [type] $name [description]
     */
    public function __unset($name) {
        $this->remove($name);
    }

    /**
     * 获取缓存文件名
     * @param  [type] $name [description]
     * @return [type]       [description]
     */
    public static function getFile($name) {
        return CACHE_PATH . 'cache/' . crc32($name) . '.ca';
    }

}



返回顶部