首頁  >  文章  >  後端開發  >  聊聊一些常見的PHP快取寫法

聊聊一些常見的PHP快取寫法

PHPz
PHPz原創
2023-04-25 17:36:15684瀏覽

在網站開發中,快取是提高網站效能的有效手段。而PHP作為廣泛應用的程式語言之一,也提供了多種快取的實作方式。本文將介紹一些常見的PHP快取寫入法,幫助開發者優化網站效能。

一、檔案快取

檔案快取是一種簡單的快取方法,透過將資料序列化後寫入檔案中,實現資料快取。程式碼實作如下:

function getCache($key, $lifetime) {
    $cacheFileName = md5($key) . '.cache';    // 产生缓存文件名
    if(file_exists($cacheFileName) && (time() - filemtime($cacheFileName)) < $lifetime) {
        // 缓存未过期,直接读取缓存文件
        return unserialize(file_get_contents($cacheFileName));
    } else {
        // 缓存已过期或不存在,重新获取数据并缓存
        $data = getData();
        file_put_contents($cacheFileName, serialize($data));
        return $data;
    }
}

在上述程式碼中,我們透過檔案名稱產生規則來避免快取檔案名稱衝突,同時在每次取得快取資料時判斷快取是否過期,從而確保快取資料的有效性。但這種方式也存在一些缺陷,如檔案系統IO操作成本較高,對伺服器效能有一定影響。

二、記憶體快取

記憶體快取比檔案快取更有效率,它將快取資料儲存在記憶體中,不需要進行檔案系統IO操作,從而提高了資料擷取速度。常見的記憶體快取解決方案有以下兩種:

  1. Memcache

#Memcache是​​一種基於記憶體的分散式快取解決方案,它可以在多台伺服器中進行快取資料的讀取和寫入操作。 Memcache的PHP擴充提供了簡單易用的接口,使得開發者可以輕鬆實現資料的快取讀取和寫入操作。程式碼實作如下:

$memcache = new Memcache;
$memcache->connect('localhost', 11211);
// 缓存读取操作
$data = $memcache->get($key);
if($data === false) {
    // 缓存不存在,重新获取数据并缓存
    $data = getData();
    $memcache->set($key, $data);
}

在上面的程式碼中,我們實例化了一個Memcache對象,然後建立了一個與本機的連接埠為11211的Memcache服務的連接。在進行快取操作時,只需要透過get和set方法來讀取和寫入快取即可。

  1. Redis

Redis是一種基於記憶體的高效能非關聯式資料庫,它支援多種資料結構和進階快取策略,並能夠支撐高並發和快速回應的網路服務。 Redis的PHP擴充提供了API支持,使得開發者可以輕鬆地將Redis作為快取解決方案。

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 缓存读取操作
$data = $redis->get($key);
if($data === false) {
    // 缓存不存在,重新获取数据并缓存
    $data = getData();
    $redis->set($key, $data);
}

在上述程式碼中,我們先連接Redis伺服器,然後透過get和set方法進行快取讀取和寫入操作。

三、OPcache

OPcache是​​PHP 5.5.0版本之後自帶的一個字節碼快取擴展,它可以將PHP檔案中的程式碼快取到記憶體中,從而提高解釋器的執行速度。因為快取的是字節碼,所以它能夠大幅減少解釋器解釋PHP腳本的時間。開啟OPcache的方法非常簡單:

  1. 修改php.ini檔案

#在php.ini檔案中找到[OPcache],將這個擴充開啟:

; 打开OPcache扩展
zend_extension=opcache.so
[opcache]
; 缓存内存大小
opcache.memory_consumption=128
; 缓存路径
opcache.file_cache=/tmp
; 开启缓存
opcache.enable=1
  1. 程式碼中使用OPcache
$cacheFilePath = 'cache.txt';
// 判断缓存是否存在且未过期
if(!empty(opcache_get_status()) && @file_exists($cacheFilePath) && (time() - filemtime($cacheFilePath)) < 60) {
  $cache = include $cacheFilePath;
} else {
  // 缓存不存在或已过期,重新获取数据并写入缓存文件
  $data = getData();
  // 将数据进行缓存
  file_put_contents($cacheFilePath, "<?php return " . var_export($data, true) . ';');
  $cache = $data;
}

在上述程式碼中,我們首先判斷是否開啟了OPcache,然後根據快取檔案是否存在以及快取時間是否過期來決定是從快取讀取取數據,還是重新取得數據。如果快取不存在或已過期,我們將獲取到的資料序列化後寫入快取檔案中,然後透過include來讀取快取檔案中的資料。

四、總結

以上是幾種常見的PHP快取寫入方法,每種方法都有其各自的優缺點,開發者需要根據特定專案情況選擇合適的快取解決方案。文件快取雖然容易實現,但是效率低下,記憶體快取雖然效率高,但是操作相對複雜。而OPcache則是PHP自帶的字節碼快取擴展,無需手動開啟,只需要在程式碼中使用特定函數即可。

以上是聊聊一些常見的PHP快取寫法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn