天天看點

PHP之APC緩存詳細介紹(學習整理)1、APC緩存簡介2、APC子產品安裝initphp架構之APC緩存類

1、APC緩存簡介

APC,全稱是Alternative PHP Cache,官方翻譯叫”可選PHP緩存”。它為我們提供了緩存和優化PHP的中間代碼的架構。 APC的緩存分兩部分:系統緩存和使用者資料緩存。

系統緩存

它是指APC把PHP檔案源碼的編譯結果緩存起來,然後在每次調用時先對比時間标記。如果未過期,則使用緩存的中間代碼運作。預設緩存 3600s(一小時)。但是這樣仍會浪費大量CPU時間。是以可以在php.ini中設定system緩存為永不過期(apc.ttl=0)。不過如果這樣設定,改運php代碼後需要重新開機WEB伺服器。目前使用較多的是指此類緩存。

使用者資料緩存

緩存由使用者在編寫PHP代碼時用apc_store和apc_fetch函數操作讀取、寫入的。如果資料量不大的話,可以一試。如果資料量大,使用類似memcache此類的更加專著的記憶體緩存方案會更好

緩存key生成規則

APC的緩存中的每個slot都會有一個key,key是 apc_cache_key_t結構體類型,除了key相關的屬性,關鍵是h字段的生成。

h字段決定了此元素落于slots數組的哪一個位置。對于使用者緩存和系統緩存,其生成規則不同。 使用者緩存通過

apc_cache_make_user_key函數生成key。通過使用者傳遞進來的key字元串,依賴PHP核心中的hash函數(PHP的hashtable

所使用的hash函數:zend_inline_hash_func),生成h值。 系統緩存通過apc_cache_make_file_key函數生成key。通過APC的配置項apc.stat的開關來差別對待不同的方案。在打開的情

況下,即 apc.stat= On 時,如果被更新則自動重新編譯和緩存編譯後的内容。此時的h值是檔案的device和inode相加所得的值。

在關閉的情況下,即apc.stat=off時,當檔案被修改後,如果要使更新的内容生效,則必須重新開機Web伺服器。此時h值是根據檔案

的路徑位址生成,并且這裡的路徑是絕對路徑。即使你是使用的相對路徑,也會查找PG(include_path)定位檔案,以取得絕對路

徑,是以使用絕對路徑會跳過檢查,可以提高代碼的效率。

常用APC設定

apc.cache_by_default 預設啟用緩存。1表示“啟用”,0表示“禁用”
apc.filters

根據逗号分隔的POSIX正規表達式判斷檔案需要緩存還是不需要緩存。以a+開頭的正則

表達式将強制APC不緩存與此正規表達式比對的任何檔案。以a-開頭的正規表達式将強制

APC緩存與此正規表達式比對的任何檔案

apc.stat

啟用或禁用APC對于所有請求PHP腳本是否有更改的檢查。每次調用腳本時均會執行此

過程。如果禁用該設定,在對PHP腳本進行任意更改後均需要重新啟動WEB伺服器以

清除緩存并更改腳本内容。0=禁用,1=啟用,預設1

apc.enabled 啟用或禁用APC緩存。0=禁用,1=啟用,預設1
apc.shm_size 設定APC允許使用的共享記憶體大小,此值以兆位元組為機關
apc.shm_segments 設定可用的共享記憶體段總數
apc.include_once_override 啟用或禁用include_once和require_once的優化。啟用該設定時,可減少PHP内部函數進行的額外系統調用。0=禁用,1=啟用,預設0
apc.optimization 設定優化級别。0=禁用優化功能
apc.num_files_hint 設定你認為需要緩存的檔案數。預設值1000,如果不确定檔案數,可以設定0
apc.ttl 設定檔案存儲在緩存中的過期時間,以秒為機關。
apc.write_lock 開啟該設定将強制單個程序緩存特定的腳步。适用于必須緩存多個檔案的大流量WEB伺服器或應用程式

添加緩存過程

以使用者緩存為例,apc_add函數用于給APC緩存中添加内容。如果key參數為字元串中,APC會根據此字元串生成key,如果key

參數為數組,APC會周遊整個數組,生成key。根據這些key,APC會調用_apc_store将值存儲到緩存中。由于這是使用者緩存,

目前使用的緩存為apc_user_cache。執行寫入操作的是apc_cache_make_user_entry函數,其最終調用

apc_cache_user_insert執行周遊查詢和寫入操作。與此對應,系統緩存使用apc_cache_insert執行寫入操作,其最終都會調

用_apc_cache_insert。

不管是使用者緩存還是系統緩存,大體的執行過程類似,步驟如下:

  1. 通過求餘操作,定位目前key的在slots數組中的位置: cache->slots[key.h % cache->num_slots];
  2. 在定位到slots數組中的位置後,周遊目前key對應的slot連結清單,如果存在slot的key和要寫入的key比對或slot過期,清除目前slot。
  3. 在最後一個slot的後面插入新的slot。

2、APC子產品安裝

WINDOWS

第一步:下載下傳php_apc.dll 在http://pecl.php.net/package/apc 要與php版本對應 将php_apc.dll放入你的ext目錄

第二步:讓php.ini支援apc擴充子產品。 然後打開php.ini 加入:

extension=php_apc.dll

apc.rfc1867 = on

apc.max_file_size = 100M

upload_max_filesize = 100M

post_max_size = 100M

//以上參數可自己定義

第三步:檢查是否支援PHP APC apc_store apc_fetch PHP APC 配置參數 把相關的配置放在一起解釋。

apc.enabled=1 apc.enabled預設值是1,你可設成0禁用APC。如果你設定為0的時候,同樣把extension=apc.so也注釋掉(這樣可以節約記憶體資源)。一旦啟用了APC功能,則會緩存Opcodes到共享記憶體。

apc.shm_segments = 1

總結 1,使用Spinlocks鎖機制,能夠達到最佳性能。

2,APC提供了apc.php,用于監控與管理APC緩存。不要忘記修改管理者名和密碼

3,APC預設通過mmap匿名映射建立共享記憶體,緩存對象都存放在這塊”大型”的記憶體空間。由APC自行管理該共享記憶體

4,我們需要通過統計調整apc.shm_size、apc.num_files_hints、apc.user_entries_hint的值。直到最佳

5,好吧,我承認apc.stat = 0 可以獲得更佳的性能。要我做什麼都可以接受.

6,PHP預定義常量,可以使用apc_define_constants()函數。不過據APC開發者介紹說pecl hidef性能更佳,抛異define吧,它是低效的。

7,函數apc_store(),對于系統設定等PHP變量,生命周期是整個應用(從httpd守護程序直到httpd守護程序關閉),使用APC比Memcached會更好。必竟不要經過網絡傳輸協定tcp。

8,APC不适于通過函數apc_store()緩存頻繁變更的使用者資料,會出現一些奇異現象。

LIUNX

wget http://pecl.php.net/get/APC-3.1.8.tgz

tar -zxvf APC-3.1.8.tgz cd APC-3.1.8

/usr/local/php/bin/phpize

./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex --with-php-config=/usr/local/php/bin/php-config

make

sudo make install

在/usr/local/php/etc/php.ini 加入

extension = "apc.so" ;

;APC setting

apc.enabled = 1

apc.shm_segments = 1

apc.shm_size = 64M

apc.optimization = 1

apc.num_files_hint = 0

apc.ttl = 0

apc.gc_ttl = 3600

apc.cache_by_default = on

重新開機apache 或者 /usr/local/php/sbin/php-fpm restart

檢視phpinfo apc

下面引用www.initphp.com 架構的APC緩存類

initphp架構之APC緩存類

[php] view plain copy

  1. <?php  
  2. if (!defined('IS_INITPHP')) exit('Access Denied!');  
  3. class apcInit {  
  4.     public function set_cache($key, $value, $time = 0) {   
  5.         if ($time == 0) $time = null; //null情況下永久緩存  
  6.         return apc_store($key, $value, $time);;  
  7.     }  
  8.     public function get_cache($key) {  
  9.         return apc_fetch($key);  
  10.     }  
  11.     public function clear($key) {  
  12.         return apc_delete($key);  
  13.     }  
  14.     public function clear_all() {  
  15.         apc_clear_cache('user'); //清除使用者緩存  
  16.         return apc_clear_cache(); //清楚緩存  
  17.     }  
  18.     public function exists($key) {  
  19.         return apc_exists($key);  
  20.     }  
  21.     public function inc($key, $step) {  
  22.         return apc_inc($key, (int) $step);  
  23.     }  
  24.     public function dec($key, $step) {  
  25.         return apc_dec($key, (int) $step);  
  26.     }  
  27.     public function info() {  
  28.         return apc_cache_info();  
  29.     }  
  30. }

原文:http://blog.csdn.net/liuxinmingcode/article/details/8058864