1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      PHPopcache的原理及使用方法是什么

      這篇文章主要介紹了PHP opcache的原理及使用方法是什么的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇PHP opcache的原理及使用方法是什么文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

      成都創(chuàng)新互聯(lián)專注于聶拉木網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供聶拉木營(yíng)銷型網(wǎng)站建設(shè),聶拉木網(wǎng)站制作、聶拉木網(wǎng)頁(yè)設(shè)計(jì)、聶拉木網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造聶拉木網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供聶拉木網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

      PHP項(xiàng)目中,尤其是在高并發(fā)大流量的場(chǎng)景中,如何提升PHP的響應(yīng)時(shí)間,是一項(xiàng)十分重要的工作。
      而Opcache又是優(yōu)化PHP性能不可缺失的組件,尤其是應(yīng)用了PHP框架的項(xiàng)目中,作用更是明顯。

      1、概述

      在理解 OPCache 功能之前,我們有必要先理解PHP-FPM + Nginx 的工作機(jī)制,以及PHP腳本解釋執(zhí)行的機(jī)制。

      1.1 PHP-FPM + Nginx 的工作機(jī)制

      請(qǐng)求從Web瀏覽器到Nginx,再到PHP處理完成,一共要經(jīng)歷如下五個(gè)步驟:
      第一步:?jiǎn)?dòng)服務(wù)

      • 啟動(dòng)PHP-FPM。PHP-FPM 支持兩種通信模式:TCP socket和Unix socket;

      • PHP-FPM 會(huì)啟動(dòng)兩種類型的進(jìn)程:Master 進(jìn)程 和 Worker 進(jìn)程,前者負(fù)責(zé)監(jiān)控端口、分配任務(wù)、管理Worker進(jìn)程;后者就是PHP的cgi程序,負(fù)責(zé)解釋編譯執(zhí)行PHP腳本。

      • 啟動(dòng)Nginx。首先會(huì)載入 ngx_http_fastcgi_module 模塊,初始化FastCGI執(zhí)行環(huán)境,實(shí)現(xiàn)FastCGI協(xié)議請(qǐng)求代理

      • 這里要注意:fastcgi的worker進(jìn)程(cgi進(jìn)程),是由PHP-FPM來(lái)管理,不是Nginx。Nginx只是代理

      第二步:Request => Nginx

      • Nginx 接收請(qǐng)求,并基于location配置,選擇一個(gè)合適handler

      • 這里就是代理PHP的 handler

      第三步:Nginx => PHP-FPM

      • Nginx 把請(qǐng)求翻譯成fastcgi請(qǐng)求

      • 通過(guò)TCP socket/Unix Socket 發(fā)送給PHP-FPM 的master進(jìn)程

      第四步:PHP-FPM Master => Worker

      • PHP-FPM master 進(jìn)程接收到請(qǐng)求

      • 分配Worker進(jìn)程執(zhí)行PHP腳本,如果沒(méi)有空閑的Worker,返回502錯(cuò)誤

      • Worker(php-cgi)進(jìn)程執(zhí)行PHP腳本,如果超時(shí),返回504錯(cuò)誤

      • 處理結(jié)束,返回結(jié)果

      第五步:PHP-FPM Worker => Master => Nginx

      • PHP-FPM Worker 進(jìn)程返回處理結(jié)果,并關(guān)閉連接,等待下一個(gè)請(qǐng)求

      • PHP-FPM Master 進(jìn)程通過(guò)Socket 返回處理結(jié)果

      • Nginx Handler順序?qū)⒚恳粋€(gè)響應(yīng)buffer發(fā)送給第一個(gè)filter → 第二個(gè) → 以此類推 → 最終響應(yīng)發(fā)送給客戶端

      1.2 PHP腳本解釋執(zhí)行的機(jī)制

      了解了PHP + Nginx 整體的處理流程后,我們接下來(lái)看一下PHP腳本具體執(zhí)行流程,首先我們看一個(gè)實(shí)例:

         if (!empty($_POST)) {
             echo "Response Body POST: ", json_encode($_POST), "\n";
         }
         if (!empty($_GET)) {    
             echo "Response Body GET: ", json_encode($_GET), "\n";
         }

      我們分析一下執(zhí)行過(guò)程:
      1.php初始化執(zhí)行環(huán)節(jié),啟動(dòng)Zend引擎,加載注冊(cè)的擴(kuò)展模塊
      2.初始化后讀取腳本文件,Zend引擎對(duì)腳本文件進(jìn)行詞法分析(lex),語(yǔ)法分析(bison),生成語(yǔ)法樹
      3.Zend 引擎編譯語(yǔ)法樹,生成opcode,
      4.Zend 引擎執(zhí)行opcode,返回執(zhí)行結(jié)果

      在PHP cli模式下,每次執(zhí)行PHP腳本,四個(gè)步驟都會(huì)依次執(zhí)行一遍;
      在PHP-FPM模式下,步驟1)在PHP-FPM啟動(dòng)時(shí)執(zhí)行一次,后續(xù)的請(qǐng)求中不再執(zhí)行;步驟2)~4)每個(gè)請(qǐng)求都要執(zhí)行一遍;
      其實(shí)步驟2)、3)生成的語(yǔ)法樹和opcode,同一個(gè)PHP腳本每次運(yùn)行的結(jié)果都是一樣的,在PHP-FPM模式下,每次請(qǐng)求都要處理一遍,是對(duì)系統(tǒng)資源極大的浪費(fèi),那么有沒(méi)有辦法優(yōu)化呢?
      當(dāng)然有,如:

      • OPCache:前身是Zend Optimizer+ ,是 Zend Server 的一個(gè)開源組件;官方出品,強(qiáng)力推薦

      • APC:Alternative PHP Cache 是一個(gè)開放自由的 PHP opcode 緩存組件,用于緩存、優(yōu)化 PHP 中間代碼;已經(jīng)不更新了不推薦

      • APCu:是APC的一個(gè)分支,共享內(nèi)存,緩存用戶數(shù)據(jù),不能緩存opcode,可以配合Opcache 使用

      • eAccelerate:同樣是不更新了,不推薦

      • xCache:不再推薦使用了

      2. OPCache 介紹

      OPCache 是Zend官方出品的,開放自由的 opcode 緩存擴(kuò)展,還具有代碼優(yōu)化功能,省去了每次加載和解析 PHP 腳本的開銷。PHP 5.5.0 及后續(xù)版本中已經(jīng)綁定了 OPcache 擴(kuò)展。
      緩存兩類內(nèi)容:

      • OPCode

      • Interned String,如注釋、變量名等

      3 . OPCache 原理

      OPCache緩存的機(jī)制主要是:將編譯好的操作碼放入共享內(nèi)存,提供給其他進(jìn)程訪問(wèn)。這里就涉及到內(nèi)存共享機(jī)制,另外所有內(nèi)存資源操作都有鎖的問(wèn)題,我們一一解讀。

      3.1 共享內(nèi)存

      UNIX/Linux 系統(tǒng)提供很多種進(jìn)程間內(nèi)存共享的方式:

      1.System-V shm API: System V共享內(nèi)存
      sysv shm是持久化的,除非被一個(gè)進(jìn)程明確的刪除,否則它始終存在于內(nèi)存里,直到系統(tǒng)關(guān)機(jī);
      2.mmap API:

      • mmap映射的內(nèi)存在不是持久化的,如果進(jìn)程關(guān)閉,映射隨即失效,除非事先已經(jīng)映射到了一個(gè)文件上

      • 內(nèi)存映射機(jī)制mmap是POSIX標(biāo)準(zhǔn)的系統(tǒng)調(diào)用,有匿名映射和文件映射兩種

      • mmap的一大優(yōu)點(diǎn)是把文件映射到進(jìn)程的地址空間

      • 避免了數(shù)據(jù)從用戶緩沖區(qū)到內(nèi)核page cache緩沖區(qū)的復(fù)制過(guò)程;

      • 當(dāng)然還有一個(gè)優(yōu)點(diǎn)就是不需要頻繁的read/write系統(tǒng)調(diào)用

      3.POSIX API:
      System V 的共享內(nèi)存是過(guò)時(shí)的, POSIX共享內(nèi)存提供了使用更簡(jiǎn)單、設(shè)計(jì)更合理的API.

      4.Unix socket API

      OPCache 使用了前三個(gè)共享內(nèi)存機(jī)制,根據(jù)配置或者默認(rèn)mmap 內(nèi)存共享模式。依據(jù)PHP字節(jié)碼緩存的場(chǎng)景,OPCache的內(nèi)存管理設(shè)計(jì)非常簡(jiǎn)單,快速讀寫,不釋放內(nèi)存,過(guò)期數(shù)據(jù)置為Wasted。
      當(dāng)Wasted內(nèi)存大于設(shè)定值時(shí),自動(dòng)重啟OPCache機(jī)制,清空并重新生成緩存。

      3.2 互斥鎖

      任何內(nèi)存資源的操作,都涉及到鎖的機(jī)制。
      共享內(nèi)存:一個(gè)單位時(shí)間內(nèi),只允許一個(gè)進(jìn)程執(zhí)行寫操作,允許多個(gè)進(jìn)程執(zhí)行讀操作;寫操作同時(shí),不阻止讀操作,以至于很少有鎖死的情況。
      這就引發(fā)另外一個(gè)問(wèn)題:新代碼、大流量場(chǎng)景,進(jìn)程排隊(duì)執(zhí)行緩存opcode操作;重復(fù)寫入,導(dǎo)致資源浪費(fèi)。

      4. OPCache 緩存解讀

      OPCache 是官方的Opcode 緩存解決方案,在PHP5.5版本之后,已經(jīng)打包到PHP源碼中一起發(fā)布。
      它將PHP編譯產(chǎn)生的字節(jié)碼以及數(shù)據(jù)緩存到共享內(nèi)存中, 在每次請(qǐng)求,從緩存中直接讀取編譯后的opcode,進(jìn)行執(zhí)行。
      通過(guò)節(jié)省腳本的編譯過(guò)程,提高PHP的運(yùn)行效率。如果正在使用APC擴(kuò)展,做同樣的工作,現(xiàn)在強(qiáng)烈推薦OPCache來(lái)代替,尤其是PHP7中。

      4.1 OPCode

      緩存Opcache 會(huì)緩存OPCode以及如下內(nèi)容:

      • PHP腳本涉及到的函數(shù)

      • PHP腳本中定義的Class

      • PHP腳本文件路徑

      • PHP腳本OPArray

      • PHP腳本自身結(jié)構(gòu)/內(nèi)容

      4.2 Interned String

      緩存首先我們需要理解,什么是 Interned String?
      在PHP5.4的時(shí)候, 引入了Interned String機(jī)制, 用于優(yōu)化PHP對(duì)字符串的存儲(chǔ)和處理。尤其是處理大塊的字符串,比如PHP doces時(shí),Interned String 可以優(yōu)化內(nèi)存。Interned String 緩存的內(nèi)容包括:變量名稱、類名、方法名、字符串、注釋等。

      在PHP-FPM模式中,Interned String 緩存字符,僅限于Worker 進(jìn)程內(nèi)部。而緩存到OPCache中,那么Worker進(jìn)程之間可以使用 Interned String 緩存的字符串,節(jié)省內(nèi)存。

      我們需要注意一個(gè)事情,在PHP開發(fā)中,一般會(huì)有大段的注釋,也會(huì)被緩存到OPCache中。可以通過(guò)php.ini的配置,關(guān)閉注釋的緩存。
      但是,像Zend Framework等框架中,會(huì)引用注釋,所以,是否關(guān)閉注釋的緩存,需要區(qū)別對(duì)待。

      5. OPCache 更新策略

      是緩存,都存在過(guò)期,以及更新策略等。而OPCache的更新策略非常簡(jiǎn)單,到期數(shù)據(jù)置為Wasted,達(dá)到設(shè)定值,清空緩存,重建緩存。
      這里需要注意:在高流量的場(chǎng)景下,重建緩存是一件非常耗費(fèi)資源的事兒。OPCache 在創(chuàng)建緩存時(shí)并不會(huì)阻止其他進(jìn)程讀取。這會(huì)導(dǎo)致大量進(jìn)程反復(fù)新建緩存。所以,不要設(shè)置OPCache過(guò)期時(shí)間

      每次發(fā)布新代碼時(shí),都會(huì)出現(xiàn)反復(fù)新建緩存的情況。如何避免呢?

      • 不要在高峰期發(fā)布代碼,這是任何情況下都要遵守的規(guī)則

      • 代碼預(yù)熱,比如使用腳本批量調(diào)PHP 訪問(wèn)URL,或者使用OPCache 暴露的API 如opcache_compile_file() 進(jìn)行編譯緩存

      6. OPCache 的配置

      6.1 內(nèi)存配置

      • opcache.preferred_memory_model="mmap" OPcache 首選的內(nèi)存模塊。如果留空,OPcache 會(huì)選擇適用的模塊, 通常情況下,自動(dòng)選擇就可以滿足需求。可選值包括:mmap,shm, posix 以及 win32。

      • opcache.memory_consumption=64 OPcache 的共享內(nèi)存大小,以兆字節(jié)為單位,默認(rèn)64M

      • opcache.interned_strings_buffer=4 用來(lái)存儲(chǔ)臨時(shí)字符串的內(nèi)存大小,以兆字節(jié)為單位,默認(rèn)4M

      • opcache.max_wasted_percentage=5 浪費(fèi)內(nèi)存的上限,以百分比計(jì)。如果達(dá)到此上限,那么 OPcache 將產(chǎn)生重新啟動(dòng)續(xù)發(fā)事件。默認(rèn)5

      6.2 允許緩存的文件數(shù)量以及大小

      • opcache.max_accelerated_files=2000 OPcache 哈希表中可存儲(chǔ)的腳本文件數(shù)量上限。真實(shí)的取值是在質(zhì)數(shù)集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個(gè)大于等于設(shè)置值的質(zhì)數(shù)。設(shè)置值取值范圍最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。默認(rèn)值2000

      • opcache.max_file_size=0 以字節(jié)為單位的緩存的文件大小上限。設(shè)置為 0 表示緩存全部文件。默認(rèn)值0

      6.3 注釋相關(guān)的緩存

      • opcache.load_commentsboolean 如果禁用,則即使文件中包含注釋,也不會(huì)加載這些注釋內(nèi)容。本選項(xiàng)可以和 opcache.save_comments 一起使用,以實(shí)現(xiàn)按需加載注釋內(nèi)容。

      • opcache.fast_shutdown boolean 如果啟用,則會(huì)使用快速停止續(xù)發(fā)事件。所謂快速停止續(xù)發(fā)事件是指依賴 Zend 引擎的內(nèi)存管理模塊 一次釋放全部請(qǐng)求變量的內(nèi)存,而不是依次釋放每一個(gè)已分配的內(nèi)存塊。

      6.4 二級(jí)緩存的配置

      • opcache.file_cache 配置二級(jí)緩存目錄并啟用二級(jí)緩存。啟用二級(jí)緩存可以在 SHM 內(nèi)存滿了、服務(wù)器重啟或者重置 SHM 的時(shí)候提高性能。默認(rèn)值為空字符串 "",表示禁用基于文件的緩存。

      • opcache.file_cache_onlyboolean 啟用或禁用在共享內(nèi)存中的 opcode 緩存。

      • opcache.file_cache_consistency_checksboolean 當(dāng)從文件緩存中加載腳本的時(shí)候,是否對(duì)文件的校驗(yàn)和進(jìn)行驗(yàn)證。

      • opcache.file_cache_fallbackboolean 在 Windows 平臺(tái)上,當(dāng)一個(gè)進(jìn)程無(wú)法附加到共享內(nèi)存的時(shí)候, 使用基于文件的緩存,也即:opcache.file_cache_only=1。需要顯示的啟用文件緩存。

      關(guān)于“PHP opcache的原理及使用方法是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“PHP opcache的原理及使用方法是什么”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


      本文名稱:PHPopcache的原理及使用方法是什么
      文章網(wǎng)址:http://www.ef60e0e.cn/article/isgjce.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        平昌县| 勐海县| 漳浦县| 略阳县| 车致| 建阳市| 宝兴县| 申扎县| 墨竹工卡县| 奇台县| 高台县| 柳州市| 安陆市| 锦屏县| 西平县| 哈密市| 辉南县| 建水县| 错那县| 青州市| 保康县| 景宁| 云林县| 康马县| 胶南市| 当雄县| 灵璧县| 乌拉特前旗| 辽中县| 进贤县| 普兰县| 葵青区| 鹤岗市| 茂名市| 台南县| 略阳县| 会昌县| 海淀区| 广西| 尉氏县| 广安市|