php緩存之apc

apc緩存分爲系統緩存和用戶緩存,系統緩存是自動的,須要配置文件設置好,用戶緩存相似與memcache緩存。apc緩存不適用於寫頻繁的操做,若是是用戶層緩存優memcache,memcache讀寫速度快,並且網絡共享。php


一、APC緩存簡介node

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模塊安裝apache

WINDOWS數組

第一步:下載php_apc.dll 在/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 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

3、相關參數說明

[APC]

; Alternative PHP Cache 用於緩存和優化PHP中間代碼

apc.cache_by_default = On

;SYS

; 是否默認對全部文件啓用緩衝。

; 若設爲Off並和以加號開頭的apc.filters指令一塊兒用,則文件僅在匹配過濾器時才被緩存。

apc.enable_cli = Off

;SYS

; 是否爲CLI版本啓用APC功能,僅用於測試和調試目的纔打開此指令。

apc.enabled = On

; 是否啓用APC,若是APC被靜態編譯進PHP又想禁用他,這是惟一的辦法。

apc.file_update_protection = 2

;SYS

; 當你在一個運行中的服務器上修改文件時,你應當執行原子操做。

; 也就是先寫進一個臨時文件,而後將該文件重命名(mv)到最終的名字。

; 文本編輯器及 cp, tar 等程式卻並非這樣操做的,從而致使有可能緩衝了殘缺的文件。

; 默認值 2 表示在訪問文件時若是發現修改時間距離訪問時間小於 2 秒則不作緩衝。

; 那個不幸的訪問者可能獲得殘缺的內容,不過這種壞影響卻不會經過緩存擴大化。

; 若是你能確保全部的更新操做都是原子操做,那麼能用 0 關閉此特性。

; 若是你的系統因爲大量的IO操做致使更新緩慢,你就須要增大此值。

apc.filters =

;SYS

; 一個以逗號分隔的POSIX擴展正則表達式列表。

; 若是源文件名和任意一個模式匹配,則該文件不被緩存。

; 注意,用來匹配的文件名是傳遞給include/require的文件名,而不是絕對路徑。

; 若是正則表達式的第一個字符是"+"則意味着全部匹配表達式的文件會被緩存,

; 若是第一個字符是"-"則全部匹配項都不會被緩存。"-"是默認值,能省略掉。

apc.ttl = 0

;SYS

; 緩存條目在緩衝區中容許逗留的秒數。0 表示永不超時。建議值爲7200~36000。

; 設爲 0 意味着緩衝區有可能被舊的緩存條目填滿,從而致使沒法緩存新條目。

apc.user_ttl = 0

;SYS

; 相似於apc.ttl,只是針對每一個用戶而言,建議值爲7200~36000。

; 設爲 0 意味着緩衝區有可能被舊的緩存條目填滿,從而致使沒法緩存新條目。

apc.gc_ttl = 3600

;SYS

; 緩存條目在垃圾回收表中可以存在的秒數。

; 此值提供了一個安全措施,即便一個服務器進程在執行緩存的源文件時崩潰,

; 並且該源文件已被修改,爲舊版本分配的內存也不會被回收,直到達到此TTL值爲止。

; 設爲零將禁用此特性。

apc.include_once_override = Off

;SYS

; 請保持爲Off,不然可能致使意想不到的結果。

apc.max_file_size = 1M

;SYS

; 禁止大於此尺寸的文件被緩存。

apc.mmap_file_mask =

;SYS

; 若是使用?enable-mmap(默認啓用)爲APC編譯了MMAP支持,

; 這裏的值就是傳遞給mmap模塊的mktemp風格的文件掩碼(建議值爲"/tmp/apc.XXXXXX")。

; 該掩碼用於決定內存映射區域是否要被file-backed或shared memory backed。

; 對於直接的file-backed內存映射,要設置成"/tmp/apc.XXXXXX"的樣子(剛好6個X)。

; 要使用POSIX風格的shm_open/mmap就須要設置成"/apc.shm.XXXXXX"的樣子。

; 你還能設爲"/dev/zero"來爲匿名映射的內存使用內核的"/dev/zero"接口。

; 不定義此指令則表示強制使用匿名映射。

apc.num_files_hint = 1000

;SYS

; Web服務器上可能被包含或被請求的不一樣源文件的大體數量(建議值爲1024~4096)。

; 若是你不能肯定,則設爲 0 ;此設定主要用於擁有數千個源文件的站點。

apc.optimization = 0

; 優化級別(建議值爲 0 ) 。

; 正整數值表示啓用優化器,值越高則使用越激進的優化。

; 更高的值可能有很是有限的速度提高,但目前尚在試驗中。

apc.report_autofilter = Off

;SYS

; 是否記錄全部因爲early/late binding緣由而自動未被緩存的腳本。

apc.shm_segments = 1

;SYS

; 爲編譯器緩衝區分配的共享內存塊數量(建議值爲1)。

; 若是APC耗盡了共享內存,而且已將apc.shm_size指令設爲系統容許的最大值,

; 你能嘗試增大此值。

apc.shm_size = 30

;SYS

; 每一個共享內存塊的大小(以MB爲單位,建議值爲128~256)。

; 有些系統(包括大多數BSD變種)默認的共享內存塊大小很是少。

apc.slam_defense = 0

;SYS(反對使用該指令,建議該用apc.write_lock指令)

; 在很是繁忙的服務器上,不管是啓動服務仍是修改文件,

; 均可能因爲多個進程企圖同時緩存一個文件而致使競爭條件。

; 這個指令用於設置進程在處理未被緩存的文件時跳過緩存步驟的百分率。

; 好比設爲75表示在碰見未被緩存的文件時有75%的機率不進行緩存,從而減小碰撞概率。

; 鼓勵設爲 0 來禁用這個特性。

apc.stat = On

;SYS

; 是否啓用腳本更新檢查。

; 改動這個指令值要很是當心。

; 默認值 On 表示APC在每次請求腳本時都檢查腳本是否被更新,

; 若是被更新則自動從新編譯和緩存編譯後的內容。但這樣作對性能有不利影響。

; 若是設爲 Off 則表示不進行檢查,從而使性能獲得大幅提升。

; 不過爲了使更新的內容生效,你必須重啓Web服務器。

; 這個指令對於include/require的文件一樣有效。不過須要注意的是,

; 若是你使用的是相對路徑,APC就必須在每一次include/require時都進行檢查以定位文件。

; 而使用絕對路徑則能跳過檢查,因此鼓勵你使用絕對路徑進行include/require操做。

apc.user_entries_hint = 100

;SYS

; 相似於num_files_hint指令,只是針對每一個不一樣用戶而言。

; 若是你不能肯定,則設爲 0 。

apc.write_lock = On

;SYS

; 是否啓用寫入鎖。

; 在很是繁忙的服務器上,不管是啓動服務仍是修改文件,

; 均可能因爲多個進程企圖同時緩存一個文件而致使競爭條件。

; 啓用該指令能避免競爭條件的出現。

apc.rfc1867 = Off

;SYS

; 打開該指令後,對於每一個剛好在file字段以前含有APC_UPLOAD_PROGRESS字段的上傳文件,

; APC都將自動建立一個upload_的用戶緩存條目(就是APC_UPLOAD_PROGRESS字段值)。

相關文章
相關標籤/搜索