Apc緩存Opcode

1、PHP執行

PHP的運行階段也分成三個階段:

    • Parse。語法分析階段。

    • Compile。編譯產出opcode中間碼。

    • Execute。運行,動態運行進行輸出。

                                          1.jpg

      由于PHP是個解釋型語言執行的時候先得把程序讀進來,然后由Zend引擎編譯成opcode。最后Zend虛擬機順次執行這些opcode(指令)完成操作。因此我們可 以把這個Opcode緩存起來,下次就能避免重新編譯了。 

APC緩存作用如下:

                                                       2.png

2 、APC簡介

        Alternative PHP Cache (APC) 是一個開放自由的PHP opcode 緩存。它的目標是提供一個自由、 開放,和健全的框架用于緩存和優化PHP的中間代碼。

      PHP APC提供兩種緩存功能,即緩存Opcode(目標文件),我們稱之為apc_compiler_cache。同時它還提供一些接口用于PHP開發人  

         APC的主頁是:php apc 。目前的版本是3.1.13,通過PECL安裝,需要php4.3.0或更高版本

3、安裝配置

一般是下載源代碼然后phpize來編譯安裝,安裝完以后在加上php.ini里加上
extension=apc.so 
這么一行就行了. 具體步驟如下:

下載:http://pecl.php.net/get/APC-3.1.5.tgz  (http://pecl.php.net/package/apc

注意:最新穩定版是APC-3.1.9.tgz,但是在php5.4或者5.5版本編譯apc都有問題。

APC-3.1.9.tgz編譯報錯:

/tmp/pear/temp/APC/apc_zend.c: In Funktion ?apc_get_zval_ptr?:  
/tmp/pear/temp/APC/apc_zend.c:62: Fehler: ?zend_execute_data? hat kein Element namens ?Ts?  
/tmp/pear/temp/APC/apc_zend.c:64: Fehler: ?zend_execute_data? hat kein Element namens ?Ts?  
/tmp/pear/temp/APC/apc_zend.c:67: Fehler: ?zend_execute_data? hat kein Element namens ?CVs?  
/tmp/pear/temp/APC/apc_zend.c: In Funktion ?apc_op_ZEND_INCLUDE_OR_EVAL?:  
/tmp/pear/temp/APC/apc_zend.c:170: Fehler: ?zend_execute_data? hat kein Element namens ?Ts?  
/tmp/pear/temp/APC/apc_zend.c:170: Fehler: ?zend_execute_data? hat kein Element namens ?Ts?  
/tmp/pear/temp/APC/apc_zend.c:170: Fehler: ?zend_execute_data? hat kein Element namens ?Ts?  
/tmp/pear/temp/APC/apc_zend.c:171: Fehler: ?zend_execute_data? hat kein Element namens ?Ts?

 php5.4或者php5.5應該使用XCache or Zend OPCache 代替 APC。

http://www.litespeedtech.com/support/forum/threads/solved-php-5-5-6-install-fails-on-apc.7809/

 wget http://centminmod.com/centminmodparts/apc/php550/APC-3.1.13.tgz

# tar -xzvf  APC-3.1.5.tgz

#cd  APC-3.1.5

# /usr/bin/phpize

# ./configure --enable-apc --enable-mmap --enable-apc-spinlocks --disable-apc-pthreadmutex

#make

#make install

注意:我們這里支持mmap,同時采用spinlocks自旋鎖。Spinlocks是Facebook推薦使用,同時也是APC開發者推薦使用的鎖機制。 使用spinlocks(自旋)鎖機制,能夠達到最佳性能

php.ini

查找extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"

下面添加extension = "apc.so"

配置php.ini 的APC

apc.rfc1867 = on

;最大上傳文件

apc.max_file_size = 800M   apc.enable_cli = off  ; 是否為cli版本啟用apc功能,僅用于測試和調試目的才打開此指令。

apc.enabled = 1  ;允許apc,apc.enabled默認值是1,你可設成0禁用APC。如果你設置為0的時候,同樣把extension=apc.so也注釋掉(這樣可以節約內存資源)。一旦啟用了APC功能,則會緩存Opcodes到共享內存。

apc.shm_segments = 1 ;對編譯器緩存要分配的共享內存塊的數目

apc.shm_size = 64   ;apc.shm_size就是給APC開的緩存大小,以 MB 為單位的每個共享內存塊的大小 。默認時,有些系統(包括大多數 BSD 變種)的共享內存塊大小非常低。

apc.shm_segments = 1
apc.shm_size = 30
APC既然把數據緩存在內存里面,我們就有必要對它進行內存資源限定。通過這二個配置可以限定APC可以使用的內存空間大小。apc.shm_segments指定了使用共享內存塊數,而apc.shm_size則指定了一塊共享內存空間大小,單位是M。所以,允許APC使用的內存大小應該是 apc.shm_segments * apc.shm_size = 30M。你可以調整一塊共享內存的大小空間。當然,一塊共享內存最大值是受操作系統限制的,即不能超過/proc/sys/kernel/shmmax大小。否則APC創建共享內存的時候,會失敗。在apc.shm_size達到了上限的時候,你可以通過設置apc.shm_segments來允許APC使用更多的內存空間。我們推薦,如果調用APC使用內存空間的話,先考濾apc.shm_size,后考濾apc.shm_segments。具體數值,可以根據apc.php監控情況進行規劃與調整。值得注意的是,每一次調整需要重啟httpd守護進程,這樣可以重新加載apc.so模塊。跟隨著httpd守護進程啟動,apc.so模塊就會加載。apc.so加載初始化的時候,通過mmap請求分配內存指定大小的內存,即apc.shm_size * apc.shm_segments。而且,這里使用的是匿名內存映射方式,通過映射一個特殊設備/dev/zero,提供一個“大型”的,填滿了零的內存供APC管理。
為了驗證以上陳述,我們注釋掉apc.ini配置,并且寫了以下php腳本觀察apc.so模塊初始化的分配的內存空間。

apc.optimization = 0    ;優化級別。設為 0 則禁用優化器,更高的值則使用更主動的優化。

apc.num_files_hint = 1000 ;Web 服務器上的被包含或被請求的不同源文件的數目的大概估計
apc.ttl = 0      ;緩存條目在緩沖區所允許的空閑時間的秒數
apc.gc_ttl = 3600 ;緩存條目在垃圾回收表中能夠存在的秒數

apc.cache_by_default = On ;默認為 on,但可以設為 off 并和加號開頭的 apc.filters 一起用 

;/*則文件僅在匹配過濾器時被緩存。*/
apc.slam_defense = 0

apc.file_update_protection = 2

apc.enable_cli = 0

apc.stat=0;調試

是否啟用腳本更新檢查。 改變這個指令值要非常小心。 默認值 On 表示APC在每次請求腳本時都檢查腳本是否被更新, 如果被更新則自動重新編譯和緩存編譯后的內容。但這樣做對性能有不利影響。 如果設為 Off 則表示不進行檢查,從而使性能得到大幅提高。 但是為了使更新的內容生效,你必須重啟Web服務器(譯者注:如果采用cgi/fcgi類似的,需重啟cgi/fcgi進程)。 生產服務器上腳本文件很少更改, 可以通過禁用本選項獲得顯著的性能提升。

這個指令對于include/require的文件同樣有效。但是需要注意的是, 如果你使用的是相對路徑,APC就必須在每一次include/require時都進行檢查以定位文件。 而使用絕對路徑則可以跳過檢查,所以鼓勵你使用絕對路徑進行include/require操作

配置詳解:

http://www.php.net/manual/zh/apc.configuration.php
          重新啟動apache服務器,查看phpinfo中是否有apc的配置項目,有的話就配置成功了.

4、APC管理界面

 到pecl.php.net下載 apc源碼包有個apc.php,copy到你的web server可以訪問到的地方,瀏覽即可訪問。

管理界面功能有:

1. Refresh Data

2. View Host Stats

3. System Cache Entries  (緩存opcode碼)

4. User Cache Entries (用戶自定義的緩存數據)

5. Version Check

    3.jpg

5. APC的使用

APC的使用其實倒說不上.APC是個優化器,自安裝之日起,就默默地在后臺為您的PHP應用服務了.您的所有PHP代碼會被緩存起來.
另外,APC可提供一定的內存緩存功能.但是這個功能并不是十分完美,有報告說如果頻繁使用APC緩存的寫入功能,會導致不可預料的錯誤.如果想使用這個功能,可以看看apc_fetch,apc_store等幾個與apc緩存相關的函數.
從PHP5.2開始,APC引入了一個小甜餅,解決了困擾大家已久的大文件上傳的進度條問題.。

6. APC的高級使用

1.緩存期限:

APC的緩存分兩部分:系統緩存和用戶數據緩存.

系統緩存: 是自動使用的,是指APC把PHP文件源碼的編譯結果緩存起來,然后在再次調用時先對比時間標記。如果未過期,則使用緩存代碼運行。默認緩存 3600s(一小時).但是這樣仍會浪費大量CPU時間.因此可以在php.ini中設置system緩存為永不過期(apc.ttl=0).不過如果這樣設置,改運php代碼后需要restart一下您的web服務器(比如apache…).目前對APC的性能測試一般指的是這一層cache;

用戶數據緩存:由用戶在編寫php代碼時用apc_store和apc_fetch函數操作讀取、寫入的.如果量不大的話我建議可以使用一下.如果量大,我建議使用memcache會更好.
如果要享受APC帶來的緩存大文件上傳進度的特性,需要在php.ini中將apc.rfc1867設為1,并且在表單中加一個隱藏域APC_UPLOAD_PROGRESS,這個域的值可以隨機生成一個hash,以確何唯一.具體例子請參見前面給出的鏈接.

6、測試效率

    從Ethna框架來測試:

    第一次執行:

     Time:260.53491973877ms
   memory:6.2379684448242MB

   第二次執行:

   Time:199.43404197693ms
   memory:1.1883926391602MB

    性能提高了30%。

7、apc與memcache對比

1,使用apc_fetch獲取數據,每次大約1-2微秒。 (10萬次170ms)
2,使用Memcache::get通過localhost獲取本服務器的數據,每次大概41微秒。 (10萬次4160ms)
3,使用Memcache::get通過本機IP地址獲取本服務器的數據,每次大概42微秒。  (10萬次4268ms)
4,使用Memcache::get通過IP地址獲取同網段(千兆以太網)其他機器的數據,每次大概110微秒。  (10萬次11268ms)

5,使用Redis::get通過IP地址獲取同網段(千兆以太網)其他機器的數據,每次大概220微秒。  (10萬次21700ms)

8、php5.5之APC

APC在PHP5.4及以下版本是性能最好的代碼緩存。不過PHP升級到5.5及以上后,APC不再有效。需要使用Zend的OpCache擴展。PHP 5.5已經集成Zend Opcache功能緩存速度比APC、eAccelerator、XCache更快

要啟用Opcache擴展,有兩步:

1. 安裝opcache

編譯安裝PHP5.5的時候加上–enable-opcache

2.在php.ini文件中添加如下配置

zend_extension=opcache.so
[opcache]
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable=1
opcache.enable_cli=1

轉自:http://blog.csdn.net/hguisu/article/details/7398613

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/3043

(0)
s19930811s19930811
上一篇 2015-04-10
下一篇 2015-04-10

相關推薦

  • LAMP平臺基于NFS實現web服務器負載均衡

    前言 隨著訪問量的逐漸增大,一臺web服務器可能已經無法滿足需求,這就需要增加web服務器的數量了,于是問題就來了:如何保證兩臺服務器數據同步呢?本文將講解如何基于NFS實現web服務器的負載均衡及數據同步。 NFS服務介紹 NFS(Network File System)網絡文件系統,允許一個系統通過網絡共享目錄和文件,通過使用NFS,用戶和程序可以像訪問…

    Linux干貨 2015-04-22
  • Linux 發展史

    摘要:     Linux是一款基于Unix的服務端操作系統,目前已廣泛應用于國內外的服務器端操作系統領域,其開源性是其獲得及其快速的發展,目前至少已有數百種發行版本。 本文主要講述了linux的系統簡介、發展歷程和Linux的發行版;     1、Linux的哲學思想:    &nbsp…

    Linux干貨 2016-10-19
  • shell 腳本 【上】

    shell 腳本編程 【上】 程序就是指令加上數據組合而成 程序編程風格:  過程式:以指令為中心,數據服務于指令  象式:以數據為中心,指令服務于數據  編程語言:  低級:匯編  高級:  編譯:高級語言–>編譯器–>目標代碼 java,C#  解釋…

    Linux干貨 2016-08-15
  • vim編輯器練習&任務計劃&腳本編程練習

    請詳細總結vim編輯器的使用并完成以下練習題 vim總結: vi:Visual Interface,是一種文本編輯器,所謂文本數據是基于字符編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼等等。 文本編輯器的種類:  行編輯模式:所謂行編輯器是指一行一行來編輯處理的工具,如sed。  全屏編輯器:編輯空間占據整個屏幕,如nano…

    Linux干貨 2016-10-31
  • httpd服務

             練習:        (1)基于主機名實現三個虛擬主機              …

    Linux干貨 2016-11-11
  • 命令read

    read命令是一個bash命令,它用于從鍵盤或標準輸入中讀取文本.我們可以使用read以交互的形式讀取來自用戶的輸入.并且read還提供一種不需要按回車就能夠輸入參數的方法. read可以從標準輸入中讀取單獨的一行,或者使用-u選項,從文件描述符FD中讀取.并且這單獨的行被分隔成多個域,第一個詞被賦值給第一個變量,第一個賦值給第二個變量,以此類推,直到剩下的…

    Linux干貨 2016-08-12
欧美性久久久久