php系列框架的加速器Opcache

1、我的實踐發現opcache

最近爲了應對雙十一期間高流量的衝擊,小編經過壓力測試去查找服務器性能瓶頸,發現100併發時,QPS
並非很高,但CPU和內存消耗特別高,尤爲是CPU消耗都100%了,而咱們的容器和服務器配置都差很少升級到頂級了,這不是如此好的服務器該發揮的效果,因而小編進行了一次全面排查:php

  1. 查看接口中數據庫查詢部分,該部分作了緩存,且redis的消耗並非很高,排除數據庫和緩存的影響性能因素;
  2. 查看有沒有其餘外部調用影響性能,發現這部分獲取數據僅僅是經過數據庫和緩存,所以排除;
  3. 查看接口程序代碼中有沒有複雜的邏輯計算,發現該部分處理的數據處理完了就直接緩存起來了,一段時間內數據來源都是redis緩存,所以排除
  4. 既然已上可能形成接口瓶頸的所以都排除了,那麼最有可能的是如今使用的laravel5.0框架形成接口性能如此低下,而後經過框架文檔、源碼及網上資料等發現laravel框架在運行時會加載大量框架文件,而後對這些文件進行編譯形成服務器CPU消耗特別高。經過這個方向,小編髮現了PHP一個不錯的緩存PHP編譯文件的擴展opcache。

2、opcache的原理

  1. Opcache是什麼?laravel

    Opcache是一種經過將解析的PHP腳本預編譯的字節碼(Operate Code)存放在共享內存中來避免每次加載和解析PHP腳本的開銷,解析器能夠直接從共享內存讀取已經緩存的字節碼(Operate Code),從而大大提升PHP的執行效率。
  2. 什麼是Operate Code?redis

    當解釋器完成對腳本代碼的分析後,便將它們生成能夠直接運行的中間代碼,也稱爲操做碼(Operate Code,opcode)。Opcode cache的目地是避免重複編譯,減小CPU和內存開銷。若是動態內容的性能瓶頸不在於CPU和內存,而在於I/O操做,好比數據庫查詢帶來的磁盤I/O開銷,那麼opcode cache的性能提高是很是有限的。可是既然opcode cache能帶來CPU和內存開銷的下降,這總歸是好事。現代操做碼緩存器(Optimizer+,APC2.0+,其餘)使用共享內存進行存儲,而且能夠直接從中執行文件,而不用在執行前「反序列化」代碼。這將帶來顯着的性能加速,一般特別是高流量和高併發量時下降了總體服務器的內存消耗,並且不多有缺點。
  3. 爲何要使用Opcode緩存?數據庫

    這得從PHP代碼的生命週期提及,請求PHP腳本時,會通過五個步驟,以下圖所示:

clipboard.png

Zend引擎必須從文件系統讀取文件、掃描其詞典和表達式、解析文件、建立要執行的計算機代碼(稱爲Opcode),最後執行Opcode。每一次請求PHP腳本都會執行一遍以上步驟,若是PHP源代碼沒有變化,那麼Opcode也不會變化,顯然沒有必要每次都重行生成Opcode,結合在Web中無所不在的緩存機制,咱們能夠把Opcode緩存下來,之後直接訪問緩存的Opcode豈不是更快,啓用Opcode緩存以後的流程圖以下所示:

clipboard.png

所以使用了Operate Code緩存以後,PHP代碼會直接獲取opcode後直接執行,中間的三個步驟會省略掉所以會大幅提升PHP代碼執行效率

3、Opcache的安裝和使用

  1. 安裝緩存

    當你的PHP版本低於7.0時,你能夠去http://pecl.php.net/package/ZendOpcache 根據本身的PHP版
    本下載相應的opcache版本。好比PHP5.5:http://pecl.php.net/get/zendopcache-7.0.5.tgz
    tar -zxvf zendopcache-7.0.5.tgz
    cd zendopcache-7.0.5
    phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make
    make install
    這是會在php的擴展文件夾內生成opcache.so
    PHP7.0以後自帶opcache.so無需安裝
  2. 使用服務器

    在php.ini加入zend_extension=opcache.so;
     注意:這裏是zend_extension不是extension,關於zend_extension和extension的區別能夠去查閱
     相關資料
  3. 配置併發

    關於opcache的詳細參數配置小編沒怎麼研究,針對比較核心的參數以下:
    opcache擴展位置
    zend_extension=opcache.so
    啓用opcache
    opcache.enable=1
    使用共享內存大小
    opcache.memory_consumption=200
    字符串緩存大小
    opcache.interned_strings_buffer=8
    最大緩存文件數量
    opcache.max_accelerated_files=8000
    出現異常,當即釋放所有內存
    opcache.fast_shutdown=1
    最大容許佔用內存百分比,超過此限制會重啓進程
    opcache.max_wasted_percentage=20
    若是置爲1,則將當前路徑加入到文件key中,以免可能產生的同文件名的文件key衝突
    opcache.use_cwd=1
    文件檢測週期
    revalidate_freq=3600
    啓用文件緩存時間戳
    opcache.validate_timestamps=1
相關文章
相關標籤/搜索