PHP快取之Opcode快取

在路上發表於2019-02-16

PHP快取之Opcode快取


  1. 什麼是Opcode快取?

當直譯器完成對指令碼程式碼的分析後,便將他們聲稱可以直接執行的中間程式碼,也成為操作碼(Operate Code, Opcode)。Opcode cache的目的是避免重複編譯,減少CPU和記憶體的開銷。但是一般動態網站的效能瓶頸都在IO操作以及資料庫操作,那麼Opcode快取能夠帶來的優化效果是有限的。

  1. Opcode快取的原理是什麼?

當請求PHP指令碼時,會經歷以下幾個過程:  

Zend引擎從檔案系統讀取檔案、掃面器詞典和表示式、解析檔案、建立要執行的計算機程式碼(Opcode),最後執行Opcode。每一次請求都會執行以上步驟,如果我們的PHP沒有變化,納悶Opcode也應該是沒有變化的,所以不必要每次都重新生成Opcode。根據這個原理,我們可以把Opcode快取下來,再次訪問相同檔案時,可以直接從Opcode執行檔案,啟用Opcode後檔案的執行流程如下:

  1. 有哪些PHP Opcode快取外掛?

Optimizer+(Optimizer+於2013年3月中旬改名為Opcache,PHP 5.5整合Opcache,其他的會不會消失?)、eAccelerator、xcache、APC …

  1. 使用APC實現Opcode快取

APC提供兩種快取功能,即快取Opcode(目標檔案),我們稱之為apc_compiler_cache。同時它還提供一些介面用於PHP開發人員將使用者資料駐留在記憶體中,我們稱之為apc_user_cache。我們這裡主要討論apc_compiler_cache的配置。

下載地址:http://pecl.php.net/package/APC

最新版本為APC-3.1.6.tgz

wget http://pecl.php.net/get/APC-3.1.6.tgz
tar -zxvf APC-3.1.6.tgz
cd APC-3.1.6
/home/ad/php/bin/phpize
./configure --enable-apc --enable-apc-mmap  --with-php-config=/home/ad/php/bin/php-config
make
make install

編輯php.ini,新增apc的配置

[apc]
extension=apc.so
apc.enabled=1
apc.shm_segments = 1
apc.shm_size = 128
apc.ttl = 0
apc.user_ttl = 7200
apc.num_files_hint = 1000
apc.write_lock=1
apc.stat = 0
apc.max_file_size=1M
apc.filters = a.php,b.php
apc.cache_by_default=1

配置說明:

apc.enabled 開啟apc 設定為0關閉,1為開啟
apc.shm_segments 共享記憶體塊數
apc.shm_size 共享記憶體大小,但是是M
那麼顯然共享記憶體的總數就是apc.shm_segments*apc.shm_size
apc.num_files_hint 允許多少個opcode被快取
apc.stat 為1的時候會自動檢查opcode對應的php檔案是否有更新,有更新的話會自動更新。設定為0的話就不會去檢查了這樣會提高apc的效率,但是要使php的修改生效的話就必須重啟apache了,或者使用函式apc_cache_clear()來清空快取
apc.ttl opcode快取的過期時間,設定為0表示不過期,如果不為0會檢查兩次請求之間的時間,如果時間大於設定值那麼會更新opcode快取
apc.write_lock 表示多個程式同時更新一份opcode快取的時候那麼只讓最先的一個生效,可以有效避免寫衝突
apc.max_file_size 超過設定值大小的檔案不被快取
apc.filters 需要特例的檔案,多個檔案用逗號(,)相隔
apc.filters 與 apc.cache_by_default結合使用,
當apc.cache_by_default為1時apc.filters檔案不被快取,當apc.cache_by_default為0時僅apc.filters檔案被快取

本文參考:

http://www.cnblogs.com/JohnAB…

http://www.cnblogs.com/Alight…

相關文章