一、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_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。
不管是使用者緩衝還是系統緩衝,大體的執行過程類似,步驟如下:
通過求餘操作,定位當前key的在slots數組中的位置: cache->slots[key.h % cache->num_slots];
在定位到slots數組中的位置後,遍曆當前key對應的slot鏈表,如果存在slot的key和要寫入的key匹配或slot到期,清除當前slot。
在最後一個slot的後面插入新的slot。
二、APC模組安裝
A.WINDOWS下安裝APC
第一步:下載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
查看phpinfo中是否有apc相關項目
B.LIUNX下安裝APC
第一步:下載和安裝
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
第二步:配置APC
在/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相關項目
三、配置參數詳解和使用總結
1).APC模組的參數配置詳解
複製代碼 代碼如下:
apc.enabled 布爾型
apc.enabled 可以被設成 0 來禁用 APC。這主要是有用的,當 APC 被靜態編譯入 PHP 時,因為沒有其它方法來禁用它(當編譯為 DSO 的時候,可以將 php.ini 中的 extension 行注釋掉)。
apc.shm_segments 整型
對編譯緩衝分配共用記憶體塊的數量。如果APC用光了共用記憶體,而且你已經設定apc.shm_size為系統允許的最大值的情況下,你可以試著去提高這個參數的值。
apc.shm_size 整型
每個共用記憶體塊的大小是以MB為單位的。在預設情況下,一些系統(包括大多數BSD變種系統)的共用記憶體塊的大小限制的很低。
apc.optimization 整型
最佳化等級。設為0則禁用最佳化,越高的值使用越強有力的最佳化。期待有適度的速度上的改進。這個還是實驗性質的。
apc.num_files_hint 整型
對在你的Web伺服器上被包含和請求的不同的源檔案的數量的提示。如果你無法確定,設定為0或者省略;這個設定主要可能用於有成千的源檔案的網站。
apc.ttl 整型
當一個緩衝條目在緩衝區的位置被另一個條目需要時,我們需要考慮的是這個緩衝條目在緩衝區的位置被允許閒置秒數。將這個參數設定為0意味著你的緩衝可能充滿不新鮮的條目,同時導致新的條目無法被緩衝。
apc.gc_ttl 整型
緩衝條目在垃圾收集列表中存活的秒數。這個值提供了出錯保護在執行一個緩衝源檔案,而同時伺服器處理序死了的事件中。如果那個源檔案被修改,記憶體配置給舊版本的緩衝條目將不會被回收,直到這個參數設定的TTL值到的時候。設定為0就是禁止這個特性。
apc.cache_by_default 布爾型
預設為On,但可以被設定為Off並和以加號開頭的apc.filters配合使用,檔案僅僅在匹配過濾器時才被緩衝。
apc.filters 字串
一個以逗號分割的POSIX擴充Regex的列表。如果任何模式比對源檔案名稱,這個檔案將不會被緩衝。注意用來匹配的檔案名稱是傳遞給 include/require 的檔案名稱,而不是絕對路徑。如果Regex的第一個字元是 + ,則這個運算式就意味著任何匹配運算式的檔案將會被緩衝,如果第一個字元是 - 則任何匹配都不會被緩衝。 - 是預設值,所以可以被省略。
apc.mmap_file_mask 字串 (這段實在不太懂,所以沒有翻譯)
If compiled with MMAP support by using --enable-mmap this is the mktemp-style file_mask to pass to the mmap module for determing whether your mmap'ed memory region is going to be file-backed or shared memory backed. For straight file-backed mmap, set it to something like/tmp/apc.XXXXXX (exactly 6 Xs). To use POSIX-style shm_open/mmap put a .shm somewhere in your mask. e.g. /apc.shm.XXXXXX You can also set it to /dev/zero to use your kernel's/dev/zero interface to anonymous mmap'ed memory. Leaving it undefined will force an anonymous mmap.
apc.slam_defense 整型
在非常繁忙的伺服器上,無論你啟動服務還是修改檔案,你都會導致一種多進程都試圖在同一個時間緩衝同一個檔案的競爭。這個選項設定了進程跳過試圖去緩衝一個未被緩衝的檔案的百分比。或者可以把這個想象成一個單獨進程跳過緩衝的機率。例如,設定apc.slam_defense為75就意味著進程有75%的機率不去緩衝未被緩衝的檔案。所以,設定的越高,越能減少緩衝的碰撞機率。設定為0則禁用這個特性。
apc.file_update_protection 整型
當你在一個運行著的伺服器上修改檔案時,你應該執行原子操作。也就是,先寫一個臨時檔案,當寫完後再重新命名(mv)這個檔案到它的最終位置。許多文字編輯器,cp,tar和其他一些類似程式都不是這樣操作的。這就意味著有機會去訪問和(緩衝)檔案,當這個檔案還在被寫的情況下。apc.file_update_protection的設定使得快取標籤新檔案的延遲。預設值是2,意味著如果發現檔案的修改時間距離訪問時間不到2秒,檔案將不會被緩衝。訪問寫到一半的檔案的不幸使用者將會看到離奇的情況,但至少這種情況不是持續的。如果你確信你經常使用原子操作來更新你的檔案,你可以關閉這個保護通過設定這個參數為0。如果你的系統充滿io操作,並導致更新程式花費超過2秒,你可能需要去增大這個值。
apc.enable-cli 整型
大多是為了測試和調試。為CLI版本的PHP開啟動APC功能。一般來說,你將不會想到為每一個CLI請求建立,移植和放棄APC的緩衝,但對於各種測試情況,這是很容易的為了CLI版本開啟APC。
2).使用總結
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()緩衝頻繁變更的使用者資料,會出現一些奇異現象。
四、使用執行個體
下面引用initphp架構的APC緩衝類
複製代碼 代碼如下:
if
class Apc{
/**
* Apc緩衝-設定緩衝
* 設定緩衝key,value和緩衝時間
* @param string $key KEY值
* @param string $value 值
* @param string $time 緩衝時間
*/
public function set_cache($key, $value, $time = 0) {
if ($time == 0) $time = null; //null情況下永久緩衝
return apc_store($key, $value, $time);;
}
/**
* Apc緩衝-擷取緩衝
* 通過KEY擷取快取資料
* @param string $key KEY值
*/
public function get_cache($key) {
return apc_fetch($key);
}
/**
* Apc緩衝-清除一個緩衝
* 從memcache中刪除一條緩衝
* @param string $key KEY值
*/
public function clear($key) {
return apc_delete($key);
}
/**
* Apc緩衝-清空所有緩衝
* 不建議使用該功能
* @return
*/
public function clear_all() {
apc_clear_cache('user'); //清除使用者緩衝
return apc_clear_cache(); //清楚緩衝
}
/**
* 檢查APC緩衝是否存在
* @param string $key KEY值
*/
public function exists($key) {
return apc_exists($key);
}
/**
* 欄位自增-用於記數
* @param string $key KEY值
* @param int $step 新增的step值
*/
public function inc($key, $step) {
return apc_inc($key, (int) $step);
}
/**
* 欄位自減-用於記數
* @param string $key KEY值
* @param int $step 新增的step值
*/
public function dec($key, $step) {
return apc_dec($key, (int) $step);
}
/**
* 返回APC緩衝資訊
*/
public function info() {
return apc_cache_info();
}
}
http://www.bkjia.com/PHPjc/736793.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/736793.htmlTechArticle一、APC緩衝簡介 APC,全稱是Alternative PHP Cache,官方翻譯叫”可選PHP緩衝”。它為我們提供了緩衝和最佳化PHP的中間代碼的架構。 APC的緩衝分...