PHP之APC緩存詳細介紹(學習整理)

APC的介紹php

The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code.node

APC官方網站:http://www.php.net/manual/en/book.apc.php正則表達式

WIN下最新版本的下載地址:http://downloads.php.net/pierre/   apache

下載鏈接:http://downloads.php.net/pierre/php_apc-3.1.4-5.3-VC6-x86.zip  根據本身的PHP編譯版本使用相對應的DLL數組

 

一、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。

二、APC模塊安裝

WINDOWS

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

第二步:讓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  
if (!defined('IS_INITPHP')) exit('Access Denied!');  
/********************************************************************************* 
 * InitPHP 2.0 國產PHP開發框架  Dao-APC緩存 不適合頻繁寫入的緩存數據 
 *------------------------------------------------------------------------------- 
 * 版權全部: CopyRight By initphp.com 
 * 您能夠自由使用該源碼,可是在使用過程當中,請保留做者信息。尊重他人勞動成果就是尊重本身 
 *------------------------------------------------------------------------------- 
 * $Author:zhuli 
 * $Dtime:2011-10-09  
***********************************************************************************/  
class apcInit {  
      
    /** 
     * 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();  
    }  
}  
相關文章
相關標籤/搜索