讓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 多久能學會?