詳細介紹PHP的另一個高效能快取擴充Yac

醉折花枝作酒筹
發布: 2023-03-10 10:56:01
轉載
1838 人瀏覽過

本篇文章給大家詳細介紹PHP的另一個高效能快取擴充Yac。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

詳細介紹PHP的另一個高效能快取擴充Yac

之前的文章中我們已經學習過一個 PHP 自帶的擴充快取 Apc ,今天我們來學習另一個快取擴充:Yac 。

什麼是 Yac

從名字其實就能看出,這又是鳥哥大神的作品。畢竟是 PHP 的核心開發人員,他的作品每次都不會讓我們失望。鳥哥可以說是我們中國程式設計師的驕傲,他在 PHP 界有舉足輕重的地位,大家可以自己搜尋一下他的博客,雖說更新頻率不高,但每篇文章都值得我們學習。

Yac 是一個無鎖共享快取系統,因為無鎖,所以它的效率非常高。據說 Apc 的效率是 Memcached 的一倍以上,而 Yac 比 Apc 更快。這就是它最大的特色。

相對於 Memcached 或 Redis 來說,Yac 更加輕量級,我們也不需要在伺服器中再安裝別的什麼軟體,只需要安裝這個擴充功能就可以使用。對於小型系統特別是就是簡單的進行資料快取的系統來說,我們不需要複雜的資料類型,只用這種程式語言的擴充就能讓我們的開發更為方便快速。

安裝的方式也非常簡單,一樣的在 PECL 下載安裝套件後進行擴充安裝即可。

基本操作

對於快取相關的操作,無外乎就是新增、修改、刪除快取。不像外部快取系統,在保存陣列或物件時,PHP 擴充類別的快取都能直接保存這些資料類型,而不會序列化為字串或轉換為 JSON 字串,這是 Apc 和 Yac 的優勢之一。

新增、取得快取

$yac = new Yac(); $yac->add('a', 'value a'); $yac->add('b', [1,2,3,4]); $obj = new stdClass; $obj->v = 'obj v'; $yac->add('obj', $obj); echo $yac->get('a'), PHP_EOL; // value a echo $yac->a, PHP_EOL; // value a print_r($yac->get('b')); // Array // ( // [0] => 1 // [1] => 2 // [2] => 3 // [3] => 4 // ) var_dump($yac->get('obj')); // object(stdClass)#3 (1) { // ["v"]=> // string(5) "obj v" // }
登入後複製

非常簡單的操作,我們只需要實例化一個 Yac 類,就可以透過 add() 方法及 get() 方法新增和取得快取內容。

Yac 擴充功能也重寫了 __set() 和 __get() 魔術方法,所以我們可以直接透過操作變數的方式來操作快取。

接下來,我們可以透過 info() 函數查看目前快取的狀態資訊。

print_r($yac->info()); // Array // ( // [memory_size] => 71303168 // [slots_memory_size] => 4194304 // [values_memory_size] => 67108864 // [segment_size] => 4194304 // [segment_num] => 16 // [miss] => 0 // [hits] => 4 // [fails] => 0 // [kicks] => 0 // [recycles] => 0 // [slots_size] => 32768 // [slots_used] => 3 // )
登入後複製

設定快取

$yac->set('a', 'new value a!'); echo $yac->a, PHP_EOL; // new value a! $yac->a = 'best new value a!'; echo $yac->a, PHP_EOL; // best new value a!
登入後複製

set() 函數的作用就是如果目前快取 key 存在,就修改這個快取的內容,如果不存在,就建立一個快取。

刪除快取

$yac->delete('a'); echo $yac->a, PHP_EOL; // $yac->flush(); print_r($yac->info()); // Array // ( // [memory_size] => 71303168 // [slots_memory_size] => 4194304 // [values_memory_size] => 67108864 // [segment_size] => 4194304 // [segment_num] => 16 // [miss] => 1 // [hits] => 6 // [fails] => 0 // [kicks] => 0 // [recycles] => 0 // [slots_size] => 32768 // [slots_used] => 0 // )
登入後複製

對於單一快取的刪除,我們可以直接使用 delete() 函數來刪除這個快取的內容。如果要清空整個快取空間,就可以直接使用 flush() 來清空整個快取空間。

別名空間

上面我們提到了 快取空間 這個東西。其實也就是在實例化 Yac 的時候可以給預設的 Yac 類別建構子傳遞一個別名配置。這樣,不同的 Yac 實例就等於放在了不同的命名空間中,相同的 Key 的快取在不同的空間中就不會相互影響。

$yacFirst = new Yac(); $yacFirst->a = 'first a!';; $yacSecond = new Yac(); $yacSecond->a = 'second a!'; echo $yacFirst->a, PHP_EOL; // second a! echo $yacSecond->a, PHP_EOL; // second a!
登入後複製

這段程式碼我們都是使用的預設的實例化 Yac 對象,雖說是分開實例化的,但它們保存的空間是一樣的,所以相同的 a 變數會相互覆蓋。

$yacFirst = new Yac('first'); $yacFirst->a = 'first a!';; $yacSecond = new Yac('second'); $yacSecond->a = 'second a!'; echo $yacFirst->a, PHP_EOL; // first a! echo $yacSecond->a, PHP_EOL; // second a!
登入後複製

當我們使用不同的實例化參數之後,相同的 a 就不會相互影響,它們被儲存在了不同的空間中。或者說,Yac 會自動為這些 Key 增加一個 prefix 。

快取時效

最後,快取系統都會針對快取內容有時效限制,如果指定了過期時間,快取內容就會在指定的時間之後過期。

$yac->add('ttl', '10s', 10); $yac->set('ttl2', '20s', 20); echo $yac->get('ttl'), PHP_EOL; // 10s echo $yac->ttl2, PHP_EOL; // 20s sleep(10); echo $yac->get('ttl'), PHP_EOL; // echo $yac->ttl2, PHP_EOL; // 20s
登入後複製

上述程式碼中的 ttl 快取只設定了 10 秒的過期時間,所以在 sleep() 10 秒後,輸出 ttl 就沒有任何內容了。

要注意的是,對於時間的設置,如果不設定的話就是長久有效,而且不能用__set() 方法設定過期時間,只能使用set() 或add() 函數來設定過期時間。

總結

怎麼樣,Yac 擴充功能是不是跟我們的 Apc 一樣方便好用,當然,更主要的是它的效能以及適用場景。對於小型系統,特別是機器配置不是那麼強的操作環境中,這種擴充型的快取系統能夠讓我們的開發更加的快速方便。關於無鎖共享的概念我們可以參考下方參考文檔中第二個鏈接,也就是鳥哥的文章中有詳細的說明。

測試程式碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/PHP%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%E9%AB%98%E6%95%88%E7%BC%93%E5%AD%98%E6%89%A9%E5%B1%95%EF%BC%9AYac.php
登入後複製

推薦學習:php影片教學

#

以上是詳細介紹PHP的另一個高效能快取擴充Yac的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!