讓PHP達到最高性能Tips1

鳥哥的博客 讓PHP7達到最高性能的幾個Tips 中,第一點就提到了Opcache;

部分原文如下:

記得啟用Zend Opcache, 因為PHP7即使不啟用Opcache速度也比PHP-5.6啟用了Opcache快,所以之前測試時期就發生了有人一直沒有啟用Opcache的事情.

那麼,Opcache 到底是什麼,為什麼啟用了Opcache 後PHP就會有如此高的性能提升?

相比於C/C++、Java而言,PHP、Python屬於解釋型語言,不產生機器碼,而是產生中間碼,我們把這個中間碼稱為 「Opcode」;

Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL,舉個例子,比如你寫下了如下的PHP代碼:

<?php

echo "Hello World";

$a = 1 + 1;

echo $a;

?>

PHP執行這段代碼會經過如下4個步驟:

1.Scanning(Lexing) ,將PHP代碼轉換為語言片段(Tokens)

2.Parsing, 將Tokens轉換成簡單而有意義的表達式

3.Compilation, 將表達式編譯成Opocde

4.Execution, 順次執行Opcode,每次一條,從而實現PHP腳本的功能。

而我們的代碼,每次運行都會重複上面的四步;

但是,業務邏輯和功能一旦完成,處於生產階段時,代碼是基本不會變化的,因此,我們大多數時間並不需要重新編譯生成Opcode;

如果我們可以將每次生成的Opcode保存下來,也就是省略前三步的編譯過程,只執行第四步,那麼我們PHP代碼的執行效率將會得到一個質的提升;

而 OPcache 就是PHP官方提供的保存Opcode的工具,基本原理就是通過將 PHP 腳本預編譯的位元組碼存儲到共享內存中,省去了每次載入和解析 PHP 腳本的開銷,從而大大提升 PHP 的性能。

在PHP 5.5.0 及後續版本中,官方已經綁定了 OPcache 擴展,不需要我們額外添加;對於 PHP 5.4及之前的版本可以使用 PECL 擴展中的 OPcache 庫。

不管使用什麼版本的PHP,都需要在php.ini中添加下面的代碼,引入擴展:

保存php.ini並退出編輯器後,查看擴展是否引入成功:

在確定Opcache擴展庫存在之後,接下來的工作就是修改php.ini 配置文件,啟動Opcache即可;

以下是西嶺老濕給出的簡單配置,並且也已經表明了注釋含義;

如果想具體查看其他配置及細節,請查看官方文檔:

PHP: 運行時配置 - Manual

//啟用操作碼緩存。如果禁用此選項,則不會優化和緩存代碼。

//在運行期使用 ini_set() 函數只能禁用 opcache.enable 設置,不可以啟用此設置。

//如果在腳本中嘗試啟用此設置項會產生警告。

opcache.enable=1

//僅針對 CLI 版本的 PHP 啟用操作碼緩存。

//通常被用來測試和調試。

opcache.enable_cli=1

//OPcache 的共享內存大小,以兆位元組為單位。

//官方建議值 128

opcache.memory_consumption=64

//用來存儲臨時字元串的內存大小,以兆位元組為單位.

//PHP 5.3.0之前的版本會忽略此配置指令。

//官方建議值 8

opcache.interned_strings_buffer=8

//OPcache 哈希表中可存儲的腳本文件數量上限。

//真實的取值是在質數集合 { 223, 463, 983, 1979, 3907,

// 7963, 16229, 32531,65407, 130987 }

//中找到的第一個大於等於設置值的質數。

//設置值取值範圍最小值是 200,

//最大值在 PHP 5.5.6 之前是 100000,

//PHP 5.5.6 及之後是 1000000。

//官方建議值 4000

opcache.max_accelerated_files=4000

//檢查腳本時間戳是否有更新的周期,以秒為單位。

//設置為 0 會導致針對每個請求,

//OPcache 都會檢查腳本更新。

//也可以簡單理解為 緩存時長

opcache.revalidate_freq=30

//如果啟用,則會使用快速停止續發事件。

//所謂快速停止續發事件是指依賴 Zend

//引擎的內存管理模塊 一次釋放全部請求

//變數的內存,而不是依次釋放每一個已分配的內存塊。

opcache.fast_shutdown=1

修改之後,重啟伺服器與php相關進程即可;

緊接著,我們對其效果進行測試:

代碼文件如下:

<?php

echo 1;

?>

使用瀏覽器訪問後,結果為 1 ;這是正常的;

但是緊接著修改代碼,速度要快:

<?php

echo 2;

?>

使用瀏覽器訪問後,結果仍然為 1 ;

不斷刷新,大約30秒過後,輸出結果為 2;

30秒的間隔就是Opcache為我們緩存了代碼造成的;

推薦閱讀:

28歲轉行,決定入坑IT崗位,短期幾個月先學習哪個方向合適?
新手適合學什麼計算機語言?
現在國內中小型的IT行業的公司,asp.net和php哪個應用得比較普遍?
有哪些好的wordpress中文主題原創作者?
PHP 多久能學會?

TAG:PHP | 编译 | 高性能 |