ARES資通電子報

技術交流

Improve Performance with Zend Data Cache

文 - Dennis

引言

上次文章我們討論了有關如何將  Sessions  利用  ADODB  自動儲存到資料庫中, 這在分布式和多臺 Server  做  Load Balancing  時很有用。本文來討論一下  Zend  公司發布的  Zend Server CE  中包含的組件  Zend Data Cache ,如何利用 Zend Data Cache 的 API 來提高程式運行的性能。

開始

有關  Cache  在詳細概念就不多介紹了,有興趣的朋友請參考  wikimedia  中有關  Cache  的詳細解釋。簡單來說,就是重複利用資源。 Cache  的方式有很多,本文主要討論  Zend Server CE  的  Data Cache  提供  API , 我們該如何利用這些  API  來提高性能。

Zend Data Cache API 的功能
  
  1. 保存 Variables  到  Cache 中
  2. 從  Cache  中取  Variables
  3. 從  Cache  中刪除  Variables
  4. 清除  Cache
  5. Disk / Memory(SHM)Storage 
  6. 使用  Namespace  Cache
  7. Cahce  時的  Directory  分層

Disk / Sharing - Memory Caching
  
 此功能提供了一些選項,以確定在哪兒存儲緩存變量。內存緩存提高了服務器的響應能力和性能的提高,在産品環境中,運行高流量的應用時更加顯其優勢,它減輕了訪問 Hardisk 的負載。 Hardisk 的緩存適用到小的應用程序,確保緩存的這些內容在重新開機後仍然可以使用。
     
共享內存 / 磁盤存儲是通過使用適當的 API 函數和配置數據高速緩存的指令。
  如果內存緩存出現錯誤時或是內存用完時, 內存選項的錯誤信息已創建來通知您。下面的例子展示了不同的存儲方式:
<?php 
// 把變量 hello1 緩存到 Hardisk
if (zend_disk_cache_store("username", "ARES001" === false){
// 不成功,退出
               echo "不成功\n";    exit();
       }
      //把變量 hello1 緩存到 Shared memory:
     if (zend_shm_cache_store("User"1) === false){
          echo "不成功\n";    exit();
     }
// 把帶 namespace 的變量 UserName 緩存到 Hardisk
if (zend_disk_cache_store("ARES::UserName", 1) === false){
             echo "不成功\n";    exit();
}
// 以共享內存的方式來緩存
if (zend_shm_cache_store("ARES::UserName", 1) === false){
               echo "不成功\n";    exit();

//把帶 namespace 的變量 UserName 緩存到 Hardisk,並限定生命周期(3)
if (zend_disk_cache_store("ARES::UserName", 2, 3) === false){
echo "不成功\n";    exit();
}
//把帶 namespace 的變量 UserName 緩存到 Shared Memory ,並限定生命周期(3)
if (zend_shm_cache_store("ARES::UserName"2, 3) === false){
  echo "不成功\n";    exit();
}
?>

支持 Namespace 緩存

Namespae(注: namespace PHP5.3+ 版本才提供的功能) 緩存提供了一個可定義的標識符,以方便從緩存中刪除指定的項目。在刪除緩存時,你可以用 namespace 的標識來刪除, 也可以用 output_cache_remove 這個 function 來進行刪除。

上面的代碼中已經有 namepace 緩存的例子,下面我們來看一個完整的 namespace 緩存的存/取/刪除的代碼片段。
<?php
    // cache the namespae variable with lifetime
    if (zend_shm_cache_store("ARES::UserName", 2, 3) === false){
                          echo "不成功\n";    exit();
    }else{
       // fetch the cahced namespace variable from shared memory
       echo  zend_shm_cache_fetch("ARES::UserName"); // will output 2
       // clear the cahced namespace variable
       zend_shm_cache_clear("ARES::UserName");
      }
?>

配置緩存資料夾的深度

我們都有這樣的常識,當一個資料夾下檔案太多時,在打開這個資料夾時,電腦都要想一下才能開的起來。如果你沒有遇到過這樣的情形,那說明你的電腦配置夠好或是文件不夠多。如何才能避免這樣的情形發生呢?最簡單的方式就是整理,把文件分類整理到不同的資料夾中。其實電腦和我們日常生活是一樣的,如果你的東西都放在一個箱子裏,找起來肯定慢,如果分門別類放在不同的小箱子,找起來就非常快了。

此功能只用在 Hardisk Cache 時,Shared Memory Caching 沒有這個概念。
 如何設定緩存資料夾的深度?

  1. 打開 Zend Server CE GUI ,如下圖


Click Directives link


如果您安裝過後沒有調整過,預設值是 2,可選值有
0 = 在一個資料夾中存儲所有的 cache file
1 = 分開在不同的資料夾存儲 cache file
2 = 分開在不同資料夾下還有子資料夾來存儲 cache file

2. 您也可以直接修改 datacache.ini 中的 zend_datacache.disk.dir_level 這個變量的值
 Linux下 datacahce.ini 位於 / usr/local / zend / etc / conf.d /
 Windows 下 datacache.ini 位於 C: \ Program Files \ zend \ etc \ 下.

何時需要使用 Hardisk Cache ?何時需要 Shared Memory Cache ?要依您實際應用的需要。如果需要在 Server 重啓後,仍然需要用到 cache 的,只能用 Hardisk Cache。使用 Shared Memory Cache 速度比 Hardisk Cache 快,但是會占用Memory,這需要您根據實際情況來選擇。

參考資料:
[1] PHP.NET  http://www.php.net
[2] Zend Server CE  http://www.zend.com
[3] Cache http://en.wikipedia.org/wiki/Cache