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 // 懶加載 //課后想一下怎么設置緩存過期