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
ubuntu服務器下詳細配置步驟如下:
1. 安裝PHP-APC module
ubuntu系統root用戶運行:apt-get -install php-apc
2. 修改PHP cgi配置文件
進入/etc/php5/apache2,目錄下文件php.ini添加以下信息
[Apc]
apc.enabled=1
apc.enable_cli=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
如圖:確保apc爲enable且對應配置的選項值正確,,可以通過phpinfo()查看詳細設置。如下圖所示:
下面引用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();
- }
- }