前端開發中的性能那點事(三)php的opcode緩存

前言:由php的運行機制決定,其實php在運行階段咱們也是能夠進行緩存的從而提升程序運行效率,這就是咱們常說的opcode緩存。
一、簡述php的運行機制
(由於本文是寫opcode緩存的因此這裏只是簡要概述,後邊會專門寫一篇揭祕php運行機制的。)
a).php文件經過瀏覽器過來
b)請求交給SAPI,隨後SAPI層將控制權轉給PHP
c)zend_language_scanner對代碼進行掃描,對php代碼進行詞法分析轉換成一系列的tokens array
d)zend_language_parser將c步驟產生的一系列tokens處理掉空格等無用的代碼之後轉換成一系列表達式
e)通過compiler階段生成opcode返回zend_op_array指針
f)zend_vm_execute根據傳入的zend_op_array指針,執行opcode並將結果返回輸出
(下圖來自互聯網,可是描述的很不錯借花獻佛了)

二、opcode簡介
Opcode是operation code(操做碼)的簡稱,其實就是第一小節c)、d)、e)步驟產生的一種中間碼,
opcode是一個四元組,(opcode, op1, op2, result),它們分別表明操做碼,第一操做數,第二操做數,結果。
如: php

1
2
3
<?php
echo"taobao search blog";
?>

對應的tokens apache

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Array
(
    [0] => Array
        (
            [0] => 367
            [1] => <?php
            [2] => 1
        )
 
    [1] => Array
        (
            [0] => 316
            [1] =>echo
            [2] => 1
        )
 
    [2] => Array
        (
            [0] => 370
            [1] =>
            [2] => 1
        )
 
    [3] => Array
        (
            [0] => 315
            [1] =>"taobao search blog"
            [2] => 1
        )
 
    [4] => ;
    [5] => Array
        (
            [0] => 370
            [1] =>
            [2] => 1
        )
 
    [6] => Array
        (
            [0] => 369
            [1] => ?>
            [2] => 1
        )
 
)

對應的opcode就是 瀏覽器

1
2
3
4
5
line     # *  op                           fetch          ext return operands
---------------------------------------------------------------------------------
   2     0  >  ECHO                                                    'taobao+search+blog'
   4     1    > RETURN                                                   1
         2*   > ZEND_HANDLE_EXCEPTION

三、使用apc對opcode緩存
a)假設php路徑爲/home/ad/php
對opcode進行緩存的軟件不少(apc、eAcclerator、Xcache、Zend Platform),這裏主要介紹apc
APC提供兩種緩存功能,即緩存Opcode(目標文件),咱們稱之爲apc_compiler_cache。同時它還提供一些接口用於PHP開發人員將用戶數據駐留在內存中,咱們稱之爲apc_user_cache。咱們這裏主要討論apc_compiler_cache的配置。
下載地址:http://pecl.php.net/package/APC
最新版本爲APC-3.1.6.tgz 緩存

1
2
3
4
5
6
7
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的配置 函數

1
2
3
4
5
6
7
8
9
10
11
12
13
[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

從新apache就ok啦 fetch

四、經常使用參數的解析
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文件被緩存 spa

相關文章
相關標籤/搜索