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 21:19
下一篇 2015-04-10 21:19

相關推薦

  • Linux磁盤和文件系統

    一.硬盤的組成     硬盤主要由圓形的盤片、機械臂和機械臂上的磁頭、主軸馬達組成。     盤片上數據的存儲:         扇區為最小的物理存儲單位,每個扇區為512bytes;  &…

    Linux干貨 2015-04-02
  • sed的模式匹配用法探討

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1405753 [root@sunsky Desktop]# cat sunsky a b c d e f [root@sunsk…

    Linux干貨 2016-08-15
  • Dell R720 安裝debian系統編譯網卡驅動

    最近比較忙,視頻也沒怎么看,下面是之前工作中遇到的問題,事后做的記錄,中間解決過程參考了網上的相關資料,現在一并貼出來。 需求:Dell R720 安裝debian系統 環境 硬件:Dell R720  軟件:系統有debian 7.0.0和debian 6.0.10 1. debian 7.0.0 : 集成了DELL PCRE H710 Mini…

    Linux干貨 2015-08-04
  • linux基礎命令: tr

    基礎命令:  tr   tr命令 功能:刪除和轉換字符 語法:tr  [OPTION]…. SET1  [SET2] 參數: -d : 刪除所有屬于第一字符集的字符(刪除某些特殊字符) -s : 把連續重復的字符以單獨一個字符表示(刪除空行很有用) 舉例: 1.把小寫字母轉換為大寫字母; cat &nbsp…

    Linux干貨 2016-08-03
  • linux文件的時間

    1,linux文件有哪些時間屬性     access time:atime 訪問時間:即查看訪問文件的時間     modify time:mtime 修改時間:修改文件內容的時間     change time:ctime 改變時間:修…

    Linux干貨 2016-06-09
  • 第四周作業2

    #### 1、 復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 首先,利用cp命令將/etc/skel目錄復制為/home/tuser1: “` [root@localhost ~]# cp -r /etc/skel /home/tuser1 “` 隨…

    Linux干貨 2018-03-24
欧美性久久久久