APC的介紹
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.
APC官方網站:http://www.php.net/manual/en/book.apc.php
WIN下最新版本的下載地址:http://downloads.php.net/pierre/
下載連接:http://downloads.php.net/pierre/php_apc-3.1.4-5.3-VC6-x86.zip 根據自己的PHP編譯版本使用相對應的DLL
1、APC緩存簡介
系統緩存
用戶數據緩存
緩存key生成規則
常用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服務器或應用程序 |
添加緩存過程
不管是用戶緩存還是系統緩存,大體的執行過程類似,步驟如下:
- 通過求余操作,定位當前key的在slots數組中的位置: cache->slots[key.h % cache->num_slots];
- 在定位到slots數組中的位置后,遍歷當前key對應的slot鏈表,如果存在slot的key和要寫入的key匹配或slot過期,清除當前slot。
- 在最后一個slot的后面插入新的slot。
2、APC模塊安裝
WINDOWS
第一步:下載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 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(); } }