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。
不管是使用者快取還是系統快取,大體的執行過程類似,步驟如下:
第二步:讓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
//以上引數可自己定義
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
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
PHP OPCode快取 APC詳細介紹
前言 php語言在效能上相對於其他編譯型語言來說效能算不上突出,但是使用了opcode快取後效能提公升還是很明顯的.常見的主要有 eaccelerator,xcache,apc本文主要介紹apc的使用.apc的介紹 the alternative php cache apc is a free an...
PHP OPCode快取 APC詳細介紹
前言 php語言在效能上相對於其他編譯型語言來說效能算不上突出,但是使用了opcode快取後效能提公升還是很明顯的.常見的主要有 eaccelerator,xcache,apc本文主要介紹apc的使用.apc的介紹 the alternative php cache apc is a free an...
php中apc快取使用示例
apc全稱alternative php cache,可以快取php的原始碼檔案,也可以快取使用者資料,下面我們就安裝一下他,看看如何查詢快取 修改快取 刪除快取等功能 記的以前php檔案上傳到伺服器時需要先用zend guard加密下,有了apc就不用了。從維基百科上看到的訊息,apc將被內建在p...