當前位置: 妍妍網 > 碼農

PHP推薦標準 PSR-6 和 PSR-16 區別

2024-03-04碼農

PHP-FIG

PHP-FIG 是指PHP Framework Interop Group(PHP框架互操作性小組),是一個由PHP社群成員組成的團體,旨在為PHP計畫制定標準和規範,以提高不同PHP框架之間的互操作性和可移植性。該小組的成員來自不同的PHP框架和計畫,如Symfony、Laravel、Zend Framework等。

PHP-FIG 制定的標準和規範通常被稱為PSR(PHP Standard Recommendations),目前已經釋出了多個PSR。這些規範包括自動載入規範、程式碼風格規範、HTTP訊息介面規範、容器規範、事件規範等。

PHP-FIG 的底層原理是透過制定規範和標準來解決PHP計畫之間的互操作性和可移植性問題。由於不同的PHP框架和計畫有不同的程式碼風格、類別庫和架構,導致它們之間的程式碼無法共享和重用。PHP-FIG的規範和標準為PHP計畫提供了一種統一的方法和標準,以確保它們可以互相配合工作。這不僅可以提高PHP計畫之間的互操作性和可移植性,還可以減少重復的勞動和提高開發效率。

PSR-6 vs PSR-16

PHP 框架互操作組 (PHP-FIG) 提供了兩項與緩存相關的公認建議:PSR-6(緩存介面)和 PSR-16(簡單緩存)。我們將看看這兩個 PSR 以找出它們之間的區別。

PSR-6

PSR-6 為緩存系統提供了一個通用介面。經過不少於四年的工作,於2015年12月8日被PHP-FIG接受。(緩存是一個相當復雜的主題,一些保留意見仍然存在,投票結果證明了這一點)

建議的目標

PSR-6 的目標是「允許開發人員建立可以整合到現有框架和系統中的緩存感知庫,而無需進行客製開發。」 (資源)

基本上,這意味著緩存庫的開發人員不必為他們的庫提供大量的介面卡類來使用不同的框架。

PSR 的範圍是明確定義的,並且不包括一些高級緩存功能,例如名稱空間或標記。 但是,一些 PSR-6 實作確實提供了這些功能。

術語

PSR-6 基於緩存池和緩存池項的概念。 池是緩存後端的抽象,例如 Redis 或 APCu。 它是池項的集合,它們是緩存在該後端的鍵值對。 計畫透過其唯一的、不可變的金鑰從池中檢索並儲存到池中。

執行

該建議在 Psr\Cache 名稱空間中提供了四個介面。

盡管命名不是很直觀,但很容易猜到 CacheItemInterface 和 CacheItemPoolInterface 分別代表緩存池項和緩存池。

請註意,透過其鍵檢索計畫不會產生儲存在緩存中的實際值,而是一個實作 CacheItemInterface 的物件。 要測試是否發生緩存命中,請在緩存項上呼叫方法 isHit(),如以下程式碼片段所示。 要檢索實際值,請在緩存項物件上呼叫 get() 方法。

$pool = new Psr6Implementation();
$item = $pool->getItem("foo");
if ($item->isHit() === false) {
$value = "bar"; // IRL: Fetch from database, compute value, ...
$item->set($value);
$pool->save($item);
else {
$value = $item->get();
}
return$value;

PSR-6 提供了豐富的介面來處理各種緩存後端。 除了檢索和儲存單個計畫之外,它還提供處理計畫集合的方法,以及以延遲方式保存計畫並批次送出它們的可能性。

至於簡單性,介面可能不是超級簡單,因為池不會立即返回實際的緩存值。 相反,將返回一個 CacheItemInterface 例項以進行操作。

PSR-16

PSR-16 在 PSR-6 之後於 2017 年 1 月 2 日被 PHP-FIG 接受。最終投票顯示明確批準,24 票贊成,3 票反對。

建議的目標

PSR-16 努力為緩存操作提供比 PSR-6 更簡單的介面,但範圍更有限。

術語

PSR-16 沒有緩存池和緩存項的概念——它只是抽象緩存。

實作

建議在 Psr\SimpleCache 名稱空間中提供三個介面。其中兩個是 PSR-6 中已知的相同例外。第三個是實際的 CacheInterface。

PSR-16 看起來很像您對典型鍵值儲存介面的期望,具有 get() 和 set() 方法接受鍵和值參數以及可選的預設值和 TTL 參數。

使用 PSR-16 重新存取上面的範例會產生類似於以下程式碼段的程式碼:

$cache = new Psr16Implementation();
if ($cache->has("foo") === false) {
$value = "bar"; // IRL: Fetch from database, compute value, ...
$cache->set("foo"$value); // Omitting try-catch clause for brevity
else {
$value = $cache->get("foo");
}
return$value;

如果您不想在緩存未命中的情況下設定該值,則可以將程式碼簡化為

$cache = new Psr16Implementation();
return $cache->get("foo""bar");

使用 PSR-16 可能會產生更簡短的程式碼,因為我們只處理一個緩存物件——沒有緩存池和計畫。也就是說,我們沒有得到 PSR-6 提供的那麽多功能,即延遲緩存寫入的能力。

結論

PSR-6 提供了一個通用的緩存介面,能夠覆蓋邊緣情況。它還具有一些高級緩存技術。對於更簡單的用例,使用緩存系統的開發人員可能更容易理解較新的 PSR-16。

幸運的是,這不是嚴格意義上的非此即彼! Psr\Cache\CacheItemPoolInterface Psr\SimpleCache\CacheInterface 只聲明了一個同名方法 clear() 。 由於兩個聲明具有相同的簽名,只要需要 5.3.9 或更高版本的 PHP 依賴項,任何緩存系統都可以實作這兩個介面。

PHP Cache 是一個緩存系統,其介面卡實作了 PSR-6 和 PSR-16 介面。 此外,Symfony 3.3 提供了將 PSR-6 緩存池轉換為 PSR-16 緩存的介面卡,反之亦然。

🚀直接使用 PSR-16 就可以啦!!!