php 文件緩存


1.文件緩存類

<?php
/**
 * 文件緩存
 */
class FileCache{
    private static $Dir = './'; // 緩存的目錄
    private static $DirMode = 0777; // 文件夾權限 一般是在linux
 
    /**
     * 設置緩存目錄
     */
    public function Dir( $dir ){
        if ( !is_dir( $dir ) ) {
            mkdir( $dir, self::$DirMode, true );
        }
        self::$Dir = $dir;
    }
 
    /**
     * 讀取緩存文件
     */
    public function Read( $file ){
        //路徑和文件名拼接起來
        $filename = self::$Dir . $file;
        if ( !file_exists( $filename ) ) {
            return false;
        }

        // 讀取緩存文件
        if (!( $handle = @fopen( $filename, 'rb' ) ) ) {
            return false;
        }

        /*
         *  先讀取第一行
         *  跳過寫入緩存文件保護代碼 <?php exit; ?>
         */ 
        fgets( $handle );
        // 取出序列化的緩存數據,並進行序列化恢復
        $data = unserialize( fgets( $handle ) );
        return $data;
    }
 
    /**
     * 寫入緩存文件
     * $file 寫入緩存的文件名
     * $data 需要進行緩存數據
     */
    public function Write( $file, $data = array() ){
        $filename = self::$Dir . $file;
        // 嘗試打開 $filename,如果文件不存在則創建
        if ( $handle = @fopen( $filename, 'wb' ) ) {
            // 取得獨占鎖定 鎖定文件我在操作時其他人不能進行操作
            @flock($handle, LOCK_EX);
            // 緩存文件建議保存為 .php 格式
            // 寫入緩存文件保護代碼
            // 防止惡意訪問該文件
            fwrite( $handle, '<' . '?php exit; ?' . '>' );
            fwrite( $handle, "\n" );
            // 序列化待緩存的數據
            $data = serialize($data);
            // 寫入緩存數據
            fwrite( $handle, $data );
            // 釋放鎖定
            @flock( $handle, LOCK_UN );
            fclose( $handle );
            return true;
        }
        return false;
    }
 
    /**
     * 清除緩存文件
     * array $fileArr 需要清除的緩存文件
     *  bool $filenameMode 完整文件名模式,為 true 時必須 $file 參數必須輸入完整的文件名,用於清除不在同一文件夾下的緩存文件!
     *
     * 案例:
     * FileCache::Clear(array('file1'),'A.php');//清除單條數據
     * FileCache::Clear(array('file1', 'file2', 'file3'),'A.php');//清除多條數據,注意:必須在同一文件夾下
     * FileCache::Clear(array('file1', 'file2', 'file3'),'A.php', './cache/A.php');//完整文件名模式
     */
    public function Clear( $fileArr,$file = '', $filename = false ) {
        if ( !is_array( $fileArr ) || empty( $fileArr ) ||  empty($file) ) {
            return;
        }

        if(!$filename){
            //先把數據讀出來
            $readArr = self::Read($file);
            // 數組函數 array_diff() 按值刪除 
            $readArr = array_diff($readArr, $fileArr);
           // 修改完在寫入
           self::Write('A.php', $readArr);
           
        }else{
            //判斷文件是否存在 防止第二次刪除時 函數報錯
            if (!file_exists( $filename ) ) {
                return false;
            }else{
                unlink($filename); 
            }
        }
        
    }
 
}

 

2.使用文件緩存

<?php
include './file.class.php';
$data = array('撒地方哼哼唧唧','aserdstyugfti');
 
// 寫入 ./cache/A.php
FileCache::Dir('./cache/');
// FileCache::Write('A.php', $data);
 
// 讀取./cache/A.php
print_r(FileCache::Read('A.php'));

//刪除
// $b = FileCache::Clear(['1234567'],'A.php','./cache/A.php');
$b = FileCache::Clear(['aserdstyugfti'],'A.php');
print_r(FileCache::Read('A.php'));
 
//文件鎖詳解
// https://www.cnblogs.com/chenwenbiao/archive/2011/08/01/2123905.html

// 如果你要在laravel使用redis
// https://blog.csdn.net/gu_wen_jie/article/details/79413365

// 懶加載
//課后想一下怎么設置緩存過期

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM