今天要做一個大文件上傳進度效果,後來網上說有php apc可以實現,後來百度了一下php apc信息,PHP APC提供兩種緩存功能,即緩存Opcode(目標文件),我們稱之為apc_compiler_cache。同時它還提供一些 接口用於PHP開發人員將用戶數據駐留在內存中,我們稱之為apc_user_cache
想用一下APC緩存到底效果如何,無奈在windows找不到相應版本的php-apc.dll擴展文件,只好在linux
下安裝了,不用源碼方式安裝,直接yum就行了:
首先要安裝apc的依賴包:
然後使用pecl安裝apc:
代碼如下 復制代碼 pecl install apc添加apc擴展到配置文件:
代碼如下 復制代碼 echo "extension=apc.so" > /etc/php.d/apc.ini最後記得重啟服務器:
代碼如下 復制代碼 service httpd restart,然後用PHP的phpinfo()函數可以檢測到:
APC緩存函數實例
在APC中我們也可以享受APC帶來的緩存大文件上傳進度的特性,需要在php.ini中將apc.rfc1867設為1,
並且在表單中加一個隱藏域 APC_UPLOAD_PROGRESS,這個域的值可以隨機生成一個hash,以確保唯一。
APC有很多設置,你可以在php.ini中對它設置,如:
[APC]
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.max_file_size = 10M
apc.stat=1
我試用了下PHP中常見的APC函數:
代碼如下 復制代碼
<?php
/*添加變量到數據存儲
bool apc_add ( string $key , mixed $var [, int $ttl = 0 ] )
如果key存在了,不會覆蓋,但返回false
*/
apc_add('url','http://www.111cn.Net');
/*從緩存中取出存儲的變量
mixed apc_fetch ( mixed $key [, bool &$success ] )
*/
var_dump(apc_fetch('url'));
/*使用 apc_store() 存儲的變量,.key是唯一的,所以 兩個值使用同一個名稱,原來的將被新的值覆蓋
bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] )
*/
apc_store('var','新的變量');
/*從用戶緩存中刪除某個變量
mixed apc_delete ( string $key )
*/
apc_delete('url');
/*清楚apc緩存
bool apc_clear_cache ([ string $cache_type ] )
*/
apc_clear_cache('user');
/*檢查APC中是否存在某個或者某些key,如果Key存在的話返回 TRUE , 否則返回 FALSE
mixed apc_exists ( mixed $keys )
*/
if(apc_exsists('url')){
echo "這個key真存在";
}else{
echo "貌似這個key是不存在的";
}
/*遞增一個儲存的數字,成功時返回 key 的當前值, 或者在失敗時返回 FALSE
int apc_inc ( string $key [, int $step = 1 [, bool &$success ]] )
*/
apc_store('anumber', 42);
$ret = apc_inc('anumber', 1, $fail);
var_dump($ret);
var_dump($fail);
/*遞減一個存儲變量的數字,成功時返回 key 的當前值, 或者在失敗時返回 FALSE
int apc_dec ( string $key [, int $step = 1 [, bool &$success ]] )
*/
$ret = apc_dec('astring', 1, $fail);
var_dump($ret);
var_dump($fail);
另外提供一個很好用的APC緩存類:
代碼如下 復制代碼<?php
/*********************************************************************************
* APC緩存類,版權(摘自InitPHP框架)
***********************************************************************************/
class MyApc {
/**
* 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();
}
}
//使用方法如下:
$apc = new MyApc();
$apc->set_cache('key','test by www.phpddt.com');
print_r($apc->get_cache('key'));
總結
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()緩存頻繁變更的用戶數據,會出現一些奇異現象。