1、PHP執行
PHP的運行階段也分成三個階段:
-
Parse。語法分析階段。
-
Compile。編譯產出opcode中間碼。
-
Execute。運行,動態運行進行輸出。
由于PHP是個解釋型語言執行的時候先得把程序讀進來,然后由Zend引擎編譯成opcode。最后Zend虛擬機順次執行這些opcode(指令)完成操作。因此我們可 以把這個Opcode緩存起來,下次就能避免重新編譯了。
APC緩存作用如下:
2 、APC簡介
Alternative PHP Cache (APC) 是一個開放自由的PHP opcode 緩存。它的目標是提供一個自由、 開放,和健全的框架用于緩存和優化PHP的中間代碼。
PHP APC提供兩種緩存功能,即緩存Opcode(目標文件),我們稱之為apc_compiler_cache。同時它還提供一些接口用于PHP開發人
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 = 0apc.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
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