PHPopcache的原理及使用方法是什么

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

成都創(chuàng)新互聯(lián)專(zhuān)注于聶拉木網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供聶拉木營(yíng)銷(xiāo)型網(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)銷(xiāo)落地服務(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)兩種類(lèi)型的進(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è) → 以此類(lèi)推 → 最終響應(yīng)發(fā)送給客戶(hù)端

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

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

<?php  
   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ǔ)法樹(shù)
3.Zend 引擎編譯語(yǔ)法樹(shù),生成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ǔ)法樹(shù)和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è)開(kāi)源組件;官方出品,強(qiáng)力推薦

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

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

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

  • xCache:不再推薦使用了

2. OPCache 介紹

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

  • OPCode

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

3 . OPCache 原理

OPCache緩存的機(jī)制主要是:將編譯好的操作碼放入共享內(nèi)存,提供給其他進(jìn)程訪(fǎng)問(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ù)從用戶(hù)緩沖區(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)單,快速讀寫(xiě),不釋放內(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í)行寫(xiě)操作,允許多個(gè)進(jìn)程執(zhí)行讀操作;寫(xiě)操作同時(shí),不阻止讀操作,以至于很少有鎖死的情況。
這就引發(fā)另外一個(gè)問(wèn)題:新代碼、大流量場(chǎng)景,進(jìn)程排隊(duì)執(zhí)行緩存opcode操作;重復(fù)寫(xiě)入,導(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 可以?xún)?yōu)化內(nèi)存。Interned String 緩存的內(nèi)容包括:變量名稱(chēng)、類(lèi)名、方法名、字符串、注釋等。

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

我們需要注意一個(gè)事情,在PHP開(kāi)發(fā)中,一般會(huì)有大段的注釋?zhuān)矔?huì)被緩存到OPCache中??梢酝ㄟ^(guò)php.ini的配置,關(guān)閉注釋的緩存。
但是,像Zend Framework等框架中,會(huì)引用注釋?zhuān)裕欠耜P(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 訪(fǎng)問(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)選擇就可以滿(mǎn)足需求??蛇x值包括: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 如果禁用,則即使文件中包含注釋?zhuān)膊粫?huì)加載這些注釋內(nèi)容。本選項(xiàng)可以和 opcache.save_comments 一起使用,以實(shí)現(xiàn)按需加載注釋內(nèi)容。

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

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

  • opcache.file_cache 配置二級(jí)緩存目錄并啟用二級(jí)緩存。啟用二級(jí)緩存可以在 SHM 內(nèi)存滿(mǎn)了、服務(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è)資訊頻道。

標(biāo)題名稱(chēng):PHPopcache的原理及使用方法是什么
網(wǎng)站鏈接:http://bm7419.com/article24/isgjce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序小程序開(kāi)發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)