天天看點

PHP APC配置及測試

 APC不适合用于頻繁寫的場合,你最好隻用它來儲存那種幾天都不會更改的内容。否則出了莫名其妙的問題就不好怎麼解釋了。

在以前的應用中,我确實有将apc用在頻繁寫的場合,偶爾會出現記憶體耗盡,進而引起所有http請求卡死,形式一發不可收拾整個伺服器當掉。是以現在我僅僅用apc來緩存opcode的php代碼,不在程式中顯式的調用它,算是相安無事。(APC的作者:Rasmus說法)

安裝APC,如果是windows下載下傳相應的.dll檔案,更改好php.ini配置,重新開機Apache,更改生效,如果是linux進行編譯安裝。

APC多用于Opcode Cache,也就是檔案代碼緩存,不需要PHP代碼重複的去解釋,是一個免費強勁的開源架構,用來緩存和優化php中間碼.它是一種php的緩存解決方案。

如果用作使用者資料存儲,安裝完以後,以下方法可以使用,如果過多使用其作為使用者資料的緩存,頻繁讀寫,會造成記憶體枯竭,以及其他怪異的問題,導緻伺服器當機都是有可能的

apc的用法比較簡單,隻有幾個函數,列舉如下:

apc_clear_cache() 清除apc緩存内容.預設(無參數)時,隻清除系統緩存,要清除使用者緩存,需用'user'參數

apc_define_constants ( string key, array constants [, bool case_sensitive] ) 将數組constants以常量加入緩存

apc_load_constants (string Key)取出常量緩存

apc_store ( string key, mixed var [, int ttl] )在緩存中儲存資料

apc_fetch ( string key )獲得apc_store儲存的緩存内容

apc_delete ( string key )删除apc_store儲存的内容

這裡介紹一下,APC的詳細配置,

APC子產品的參數配置

Name Default Changeable Changelog 

apc.enabled 1 PHP_INI_ALL 

apc.shm_segments 1 PHP_INI_SYSTEM 

apc.shm_size 30 PHP_INI_SYSTEM 

apc.optimization 0 PHP_INI_ALL 

apc.num_files_hint 1000 PHP_INI_SYSTEM 

apc.ttl 0 PHP_INI_SYSTEM 

apc.gc_ttl 3600 PHP_INI_SYSTEM 

apc.cache_by_default On PHP_INI_SYSTEM 

apc.filters "" PHP_INI_SYSTEM 

apc.mmap_file_mask "" PHP_INI_SYSTEM 

apc.slam_defense 0 PHP_INI_SYSTEM 

apc.file_update_protection 2 PHP_INI_SYSTEM 

apc.enable_cli 0 PHP_INI_SYSTEM > APC 3.0.6

apc.enabled 布爾型 

apc.stat 1 為1或者On時,修改檔案,會自動更新緩存,但是性能會略受到些影響,如果為0或者Off時,将無法自動更新緩存,修改好以後,必須重新開機web server,但是性能會相對高一些

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擴充正規表達式的清單。如果任何模式比對源檔案名,這個檔案将不會被緩存。注意用來比對的檔案名是傳遞給 include/require 的檔案名,而不是絕對路徑。如果正規表達式的第一個字元是 + ,則這個表達式就意味着任何比對表達式的檔案将會被緩存,如果第一個字元是 - 則任何比對都不會被緩存。 - 是預設值,是以可以被省略。

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。

橘×××的配置屬性需要詳細知道和記住的

APC的安裝:

一般是從http://pecl.php.net/package/APC下載下傳源代碼,然後phpize來編譯安裝,安裝完以後在加上php.ini裡加上:

extension=apc.so

同時,記得要在PHP.ini中打開opcode cache的開關:

apc.cache_by_default = on

同時也可以通過apc.filters讓APC隻對特定範圍的動态程式進行opcode緩存。

apc