分享编程~
 

php高并发数据缓存文件类简单高效带锁

php高并发数据缓存到文件自写简单高效带锁文件缓存类

天天特卖抢好货

示例:

假如个创建‘test.php’文件,里边代码编写为:

<?php
// 执行操作
$operate = isset($_GET['a']) ? $_GET['a'] : 'get';
// 缓存数据的key(缓存文件的名)
$key = isset($_GET['k']) ? $_GET['k'] : 'demo';
// 写入缓存
if($operate == 'set'){
    // 写入的缓存内容
    $data = ['code' => 400, 'msg' => 'fail'];
    // 缓存时间30秒
    $expire = 30;
    // 静态调用set方法写入缓存
    $r = Cachefiles::set($key, $data, $expire);
    var_dump($r);
}
// 读取缓存
if($operate == 'get'){
    // 静态调用get方法写入缓存
    $r = Cachefiles::get($key);
    var_dump($r);
}
// 删除缓存
if($operate == 'del'){
    // 静态调用del方法写入缓存
    $r = Cachefiles::del($key);
    var_dump($r);
}
?>

访问‘test.php’文件传入两个参数,分别是‘a’,'k'两个值控制需要操作的类方法。

缓存文件类‘Cachefiles.php’:

<?php

/**
 * Class Cachefiles数据缓存到文件
 * User: Zhuhaili
 * Date: 2023/11/9
 * Ver: v1.0
 */

class Cachefiles{

    public static $path = './cache/txt/';
    public static $key = 'demo';
    public static $expire = 0;
    public static $fileFix = '.txt';

    /**
     * Notes: 读取缓存
     * User: ZhuHaili
     * Date: 2023/11/8
     * @param $key
     * @param int $buffer
     * @return bool|string|array|object
     */
    public static function get($key, $buffer = 0){
        $key = $key ? $key : self::$key;
        $file = self::$path.$key.self::$fileFix;
        if(!file_exists($file)){
            return '';
        }
        // 读取文件
        $str = '';
        $fp = fopen($file, "r");
        if(flock($fp, LOCK_SH)) {
            // 分片读取
            if($buffer){
                // 循环读取,读完整个文件
                while(!feof($fp)){
                    // 每次读取 n 字节
                    $str .= fread($fp, $buffer);
                }
            }else{
                // 把整个文件内容读取出来
                $str = fread($fp, filesize($file));
            }
            flock($fp, LOCK_UN);
        }
        fclose($fp);
        // 无内容时删除文件且返回空
        if(!$str){
            unlink($file);
            return '';
        }
        // 判断是否过期
        $expire = (int) substr($str, 0, 10);
        if($expire){
            // 过期删除文件且返回空
            if(time() > filemtime($file) + $expire){
                unlink($file);
                return '';
            }
        }
        // 删除有效时间戳剩下的内容且返回
        $str = unserialize(substr($str, 10));
        return $str;
    }

    /**
     * Notes:写入缓存
     * User: ZhuHaili
     * Date: 2023/11/8
     * @param $key
     * @param $value
     * @param int $expire
     * @return bool
     */
    public static function set($key, $value, $expire = 0){
        if (!is_dir(self::$path)) {
            try {
                mkdir(self::$path, 0755, true);
            } catch (\Exception $e) {
                return false;
            }
        }
        $key = $key ? $key : self::$key;
        $expire = $expire ? $expire : self::$expire;
        $file = self::$path.$key.self::$fileFix;
        $data = str_pad($expire, 10, "0", STR_PAD_LEFT).serialize($value);
        try {
            $fp = fopen($file, "w");
            if (flock($fp, LOCK_EX)) {
                fwrite($fp, $data);
                flock($fp, LOCK_UN);
            }
            fclose($fp);
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }

    /**
     * Notes:删除缓存
     * User: ZhuHaili
     * Date: 2023/11/8
     * @param $key
     * @return bool
     */
    public static function del($key){
        $key = $key ? $key : self::$key;
        $file = self::$path.$key.self::$fileFix;
        if(file_exists($file)){
            try {
                unlink($file);
            } catch (\Exception $e) {
                return false;
            }
        }
        return true;
    }
}


上一篇:php不足位数补0左补右补
赞(0) 踩(0)
您说多少就多少,您的支持是我最大的动力
赏金
微 信
赏金
支付宝
本文连接: https://www.yj521.com/article/222.html
版权声明: 本文为原创文章,版权归《越加网》所有,分享转载请注明出处!