1. 程式人生 > >php apc快取以及與redis的對比

php apc快取以及與redis的對比

APC簡介

APC的全稱為Alternative PHP Cache, 是一款開源的php外掛,用來對php的程式碼或者使用者資料進行快取。

APC 對php程式碼的快取

apc可以去掉php動態解析以及編譯的時間,php指令碼可以執行的更快。下面這張圖很好的說明了為什麼了apc可以讓php指令碼執行得更快。


PHP是一個動態指令碼語言,所以為了讓使用者在瀏覽器中看到頁面內容,伺服器必須解析php程式碼從而生成想用的html程式碼。從上面的圖中可以看出,在沒有apc的時候,使用者對php頁面的每一次請求,伺服器都需要進行對php進行解析,編譯以及執行,但是很多時候,只要php程式碼沒有發生更改,php的執行邏輯就不會改變,也就是說解析以及編譯的過程就可以省略,直接執行然後將結果返回即可。這就是apc的工作,apc快取php的可執行程式碼,從而去掉了解析以及編譯的過程,加快了php指令碼的執行速度。

APC 對使用者資料的快取以及

除了快取php程式碼外,apc還可以進行使用者資料的快取,但是由於apc的容量很少,所以快取的資料最好是那些很長時間都不變的資料,不變的單位應該以天位單位。所以如果資料是變化很頻繁的並且資料量也比較大,那麼就不要使用apc了,可以使用memcache或者redis。

下面是一個apc和redis的對比測試實驗,看一下apc和redis的效率對比。

function getTimeStamp() {
  $timestr = microtime();
  $timestrary = explode(' ', $timestr);
  $result = intval($timestrary[1])*1000 + intval(floatval($timestrary[0])*1000);
  return $result;
} 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'key';
$value ='value';
$redis->set($key, $value);
  
apc_store($key, $value, 1); 
  
$begin = getTimeStamp();
for($i = 0 ; $i < 100000 ; $i = $i +1) {
  $result = apc_fetch($key);
} 
$cost = getTimeStamp() - $begin;
var_dump($cost);
$begin = getTimeStamp();
for($i = 0 ; $i < 100000 ; $i = $i +1) {
  $result = $redis->get($key);
} 
$cost = getTimeStamp() - $begin;
var_dump($cost);
$redis->close();
  

都是簡單的取資料操作,分別進行10萬次,單位是毫秒。最後的執行結果redis10萬次讀在4-5秒之間,而apc得10萬次讀只有50毫秒左右。可以看到如果是簡單的快取一些資料,並且這些資料不會變化且命中的話,apc還是能帶來一定的效率提升的。

安裝apc時會有一個apc.php的頁面可以通過這個頁面檢視apc的命中。如下圖


APC的配置

配置的例子如下:

extension= apc.so 
apc.enabled=1
apc.shm_segments=1 
apc.shm_size=64M ; apc記憶體的大小,最後的大小需要乘上segments的數量,所以這裡一共為apc分配64M 
apc.ttl=7200 
apc.user_ttl=7200
apc.enable_cli=1 ; 這個如果不開啟,則只可以在網頁上進行apc操作,不能通過cli進行apc操作


參考