首页
/
每日頭條
/
科技
/
php緩存怎麼寫
php緩存怎麼寫
更新时间:2025-11-29 15:28:06

php緩存怎麼寫?一般來說,緩存的目的是把數據放在一個地方讓網站的訪問更快,用戶體驗更好,我們現在的緩存用得最多的是 redis緩存,文件緩存現在不多用了,但是我們了解一下原理也是挺好的,再者可以學習一下寫程序的思路,我來為大家講解一下關于php緩存怎麼寫?跟着小編一起來看一看吧!

php緩存怎麼寫(無比詳細的PHP文件緩存類詳解)1

php緩存怎麼寫

一般來說,緩存的目的是把數據放在一個地方讓網站的訪問更快,用戶體驗更好,我們現在的緩存用得最多的是 redis緩存,文件緩存現在不多用了,但是我們了解一下原理也是挺好的,再者可以學習一下寫程序的思路。

代碼演示

<?php

class cache{

private $cache_dir;

private $expireTime=180; //緩存的時間是 60 秒

function __construct($cache_dirname)

{

if(!@is_dir($cache_dirname))

{

if(!@mkdir($cache_dirname,0777))

{

$this->warn('緩存文件不存在而且不能創建,需要手動創建.');

return false;

}

}

$this->cache_dir = $cache_dirname;

}

function __destruct()

{

echo 'Cache class bye.';

}

function get_url()

{

if (!isset($_SERVER['REQUEST_URI']))

{

$url = $_SERVER['REQUEST_URI'];

}else

{

$url = $_SERVER['s cript_NAME'];

$url .= (!emptyempty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';

}

return $url;

}

function warn($errorstring)

{

echo "<b><font color='red'>發生錯誤:<pre>".$errorstring."</pre></font></b>";

}

function cache_page($pageurl,$pagedata)

{

if(!$fso=fopen($pageurl,'w'))

{

$this->warns('無法打開緩存文件.');

return false;

if(!flock($fso,LOCK_EX)) //LOCK_NB,排它型鎖定

{

$this->warns('無法鎖定緩存文件.');

return false;

}

if(!fwrite($fso,$pagedata))

{

$this->warns('無法寫入緩存文件.'); //寫入字節流,serialize寫入其他格式

return false;

}

flock($fso,LOCK_UN);//釋放鎖定

fclose($fso);

return true;

}

}

function display_cache($cacheFile)

{

if(!File_exists($cacheFile))

{

$this->warn('無法讀取緩存文件.');

return false;

}

echo '讀取緩存文件:'.$cacheFile;

//return unserialize(file_get_contents($cacheFile));

$fso = fopen($cacheFile, 'r');

$data = fread($fso, filesize($cacheFile));

fclose($fso);

return $data;

}

function readData($cacheFile='default_cache.txt')

{

$cacheFile = $this->cache_dir."/".$cacheFile;

if(file_exists($cacheFile)&filemtime($cacheFile)>(time()-$this->expireTime))

{

$data=$this->display_cache($cacheFile);

}

else

{

$data="from here wo can get it from mysql database,update time is <b>".date('l dS \of F Y h:i:s A')."</b>,過期時間是:".date('l dS \of F Y h:i:s A',time() $this->expireTime)."----------";

$this->cache_page($cacheFile,$data);

}

return $data;

}

}

?>

代碼解析

這個緩存類名稱是cache

有2個屬性

private $cache_dir;

private $expireTime=180;

$cache_dir是緩存文件所放的相對網站目錄的父目錄, $expireTime(注釋一)是我們緩存的數據過期的時間

主要是這個思路

當數據或者文件被加載的時候,先判斷緩存文件存在不,返回false,文件最後修改時間和緩存的時間和比當前時間大不,大的話說明緩存還沒到期,小的話返回false,當返回false的時候,讀取原始數據,寫入緩存文件中,返回數據。

function __construct($cache_dirname)

{

if(!@is_dir($cache_dirname))

{

if(!@mkdir($cache_dirname,0777))

{

$this->warn('緩存文件不存在而且不能創建,需要手動創建.');

return false;

}

}

$this->cache_dir = $cache_dirname;

}

當類第一次被實例的時候構造默認函數帶參數緩存文件名稱,如文件不存在,創建一個有編輯權限的文件夾,

創建失敗的時候抛出異常.然後把cache類的 $cache_dir屬性設置為這個文件夾名稱,我們的所有緩存文件都是在這個

文件夾下面的.

function __destruct(){

echo 'Cache class bye.';

}

//這是class類的析構函數,為了演示,我們輸出一個字符串表示我們釋放cache類資源成功.

function warn($errorstring)

{

echo "<b><font color='red'>發生錯誤:<pre>".$errorstring."</pre></font></b>";

}

這個方法輸出錯誤信息.

function get_url()

{

if (!isset($_SERVER['REQUEST_URI']))

{

$url = $_SERVER['REQUEST_URI'];

}

else

{

$url = $_SERVER['s cript_NAME'];

$url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';

}

return $url;

}

這個方法返回當前url的信息,主要是緩存x.php?page=1, x.php?page=2,

等這種文件的,這裡列出是為了擴展的這個cache類功能的.

function cache_page($pageurl,$pagedata)

{

if(!$fso=fopen($pageurl,'w'))

{

$this->warns('無法打開緩存文件.');

return false;

if(!flock($fso,LOCK_EX)) //LOCK_NB,排它型鎖定

{

$this->warns('無法鎖定緩存文件.');

return false;

}

if(!fwrite($fso,$pagedata))

{

$this->warns('無法寫入緩存文件.'); //寫入字節流,serialize寫入其他格式

return false;

}

flock($fso,LOCK_UN);//釋放鎖定

fclose($fso);

return true;

}

}

cache_page方法分别傳入的是緩存的文件名稱和數據,這是把數據寫到文件裡的方法,先用fopen打開文件,

然後調用句柄鎖定這個文件,然後用 fwrite寫入文件,最後釋放這個句柄,任何一步發生錯誤将抛出錯誤.

您可能看到這個注釋寫入字節流,serialize寫入其他格式,順便一提的是如果我們要把一個數組,

(可以從MySQL數據庫裡面select查詢除了的結果)用 serialize函數寫入,用unserialize讀取到原來的類型.

function display_cache($cacheFile){

if(!file_exists($cacheFile)){

$this->warn('無法讀取緩存文件.');//trigger_error

return false;

}

echo '讀取緩存文件:'.$cacheFile;

//return unserialize(file_get_contents($cacheFile));

$fso = fopen($cacheFile, 'r');

$data = fread($fso, filesize($cacheFile));

fclose($fso);

return $data;

}

這是由文件名稱讀取緩存的方法,直接打開文件,讀取全部,如果文件不存在的或者無法讀取的話返回false,

當然,你感到不人性的話,可以重新生成緩存.

function readData($cacheFile='default_cache.txt')

{

$cacheFile = $this->cache_dir."/".$cacheFile;

if(file_exists($cacheFile)&filemtime($cacheFile)>(time()-$this->expireTime))

{

$data=$this->display_cache($cacheFile);

}

else

{

$data="from here wo can get it from mysql database,update time is <b>".date('l dS \of F Y h:i:s A')."</b>,過期時間是:".date('l dS \of F Y h:i:s A',time() $this->expireTime)."----------";

$this->cache_page($cacheFile,$data);

}

return $data;

}

這個函數是我們調用的方法,可以寫成接口的方法,由傳入參數判斷文件存在不,文件最後修改時間 expireTime的時間是不是過了當前時間(大于的話說明沒有過期),如果文件不存在或者已經過期,重新加載原始數據,這裡,為了簡單期間,我們是直接源是字符串,您可以把cache類繼承某類,取到數據庫的數據.

四、補充說明,結語

注釋一 :這個緩存的時間您可以自己調,可以根據時間情況讀取數組,xml,緩存等,請按照您的方便,值得一提的是緩存的時間(也就是緩存的key)也用緩存控制,.這在cms系統中被廣泛使用,他們把要更新的key放在緩存中,非常容易控制全戰.

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
excel的查找和替換
excel的查找和替換
在EXCEL工作表中輸入數據後,發現要查找和修改某些數據,如果要修改的數據量龐大,如果逐個修改,将會耗費很多時間,查找起來也不方便,此時,我們可以使用查找和替換數據進行修改。今天,和大家分享EXCEL查找和替換數據的技巧,批量完成修改。一、...
2025-11-29
睡前玩手機的危害有多嚴重
睡前玩手機的危害有多嚴重
在目前手機已經成了人們必不可少的物品,現在很多人出門吃飯工作都會随身攜帶着手機,甚至有一些人在晚上睡覺的時候也會先玩手機後再睡覺。尤其是一些上床關燈後還會躲在被窩中玩一會手機,卻不知道經常這樣做會發生一些危害。晚上熄燈玩手機會帶來哪些傷害?...
2025-11-29
自媒體新手期是否有推薦量
自媒體新手期是否有推薦量
自媒體新手期是否有推薦量?原創視頻号越火,用戶越多,問題自然就越多最近很多網友都在咨詢如何申請開通微信視頻号,我在這裡統一回答本文适合新人閱讀,老司機可以忽略,今天小編就來說說關于自媒體新手期是否有推薦量?下面更多詳細答案一起來看看吧!自媒...
2025-11-29
如何備份和恢複iphone數據
如何備份和恢複iphone數據
如何備份和恢複iphone數據?1、按住頂部的power鍵3秒;2、不要松開power鍵同時按住home鍵10秒;,今天小編就來聊一聊關于如何備份和恢複iphone數據?接下來我們就一起去研究一下吧!如何備份和恢複iphone數據1、按住頂...
2025-11-29
手機閃退是什麼原因
手機閃退是什麼原因
手機閃退是什麼原因?緩存垃圾過多,平時在使用軟件的過程中,會産生一些垃圾文件,如果長時間不清理會導緻手機越來越卡,也會出現閃退狀況,今天小編就來說說關于手機閃退是什麼原因?下面更多詳細答案一起來看看吧!手機閃退是什麼原因緩存垃圾過多,平時在...
2025-11-29
Copyright 2023-2025 - www.tftnews.com All Rights Reserved