PHP Opcache的工作原理

2022-09-14 17:09:17 字數 2924 閱讀 7014

php專案中,尤其是在高併發大流量的場景中,如何提公升php的響應時間,是一項十分重要的工作。

而opcache又是優化php效能不可缺失的元件,尤其是應用了php框架的專案中,作用更是明顯。

在理解 opcache 功能之前,我們有必要先理解php-fpm + nginx 的工作機制,以及php指令碼解釋執行的機制。

請求從web瀏覽器到nginx,再到php處理完成,一共要經歷如下五個步驟:

第一步:啟動服務

第二步:request => nginx

第三步:nginx => php-fpm

第四步:php-fpm master => worker

第五步:php-fpm worker => master => nginx

了解了php + nginx 整體的處理流程後,我們接下來看一下php指令碼具體執行流程,首先我們看乙個例項:

<?php

if (!empty($_post))

if (!empty($_get))

我們分析一下執行過程:

php初始化執行環節,啟動zend引擎,載入註冊的擴充套件模組

初始化後讀取指令碼檔案,zend引擎對指令碼檔案進行詞法分析(lex),語法分析(bison),生成語法樹

zend 引擎編譯語法樹,生成opcode,

zend 引擎執行opcode,返回執行結果

在php cli模式下,每次執行php指令碼,四個步驟都會依次執行一遍;

在php-fpm模式下,步驟1)在php-fpm啟動時執行一次,後續的請求中不再執行;步驟2)~4)每個請求都要執行一遍;

其實步驟2)、3)生成的語法樹和opcode,同乙個php指令碼每次執行的結果都是一樣的,

在php-fpm模式下,每次請求都要處理一遍,是對系統資源極大的浪費,那麼有沒有辦法優化呢?

當然有,如:

apcu:是apc的乙個分支,共享記憶體,快取使用者資料,不能快取opcode,可以配合opcache 使用

opcache 是zend官方出品的,開放自由的 opcode 快取擴充套件,還具有**優化功能,省去了每次載入和解析 php 指令碼的開銷。

php 5.5.0 及後續版本中已經繫結了 opcache 擴充套件。

快取兩類內容:

opcache快取的機制主要是:將編譯好的操作碼放入共享記憶體,提供給其他程序訪問。

這裡就涉及到記憶體共享機制,另外所有記憶體資源操作都有鎖的問題,我們一一解讀。

unix/linux 系統提供很多種程序間記憶體共享的方式:

mmap api:

posix api:system v 的共享記憶體是過時的, posix共享記憶體提供了使用更簡單、設計更合理的api.

unix socket api

opcache 使用了前三個共享記憶體機制,根據配置或者預設mmap 記憶體共享模式。

依據php位元組碼快取的場景,opcache的記憶體管理設計非常簡單,快速讀寫,不釋放記憶體,過期資料置為wasted。

當wasted記憶體大於設定值時,自動重啟opcache機制,清空並重新生成快取。

任何記憶體資源的操作,都涉及到鎖的機制。

共享記憶體:乙個單位時間內,只允許乙個程序執行寫操作,允許多個程序執行讀操作;

寫操作同時,不阻止讀操作,以至於很少有鎖死的情況。

這就引發另外乙個問題:新**、大流量場景,程序排隊執行快取opcode操作;重複寫入,導致資源浪費。

opcache 是官方的opcode 快取解決方案,在php5.5版本之後,已經打包到php原始碼中一起發布。

它將php編譯產生的位元組碼以及資料快取到共享記憶體中, 在每次請求,從快取中直接讀取編譯後的opcode,進行執行。

通過節省指令碼的編譯過程,提高php的執行效率。

如果正在使用apc擴充套件,做同樣的工作,現在強烈推薦opcache來代替,尤其是php7中。

opcache 會快取opcode以及如下內容:

首先我們需要理解,什麼是 interned string?

在php5.4的時候, 引入了interned string機制, 用於優化php對字串的儲存和處理。

尤其是處理大塊的字串,比如php doces時,interned string 可以優化記憶體。

interned string 快取的內容包括:變數名稱、類名、方法名、字串、注釋等。

在php-fpm模式中,interned string 快取字元,僅限於worker 程序內部。

而快取到opcache中,那麼worker程序之間可以使用 interned string 快取的字串,節省記憶體。

我們需要注意乙個事情,在php開發中,一般會有大段的注釋,也會被快取到opcache中。

可以通過php.ini的配置,關閉注釋的快取。

但是,像zend framework等框架中,會引用注釋,所以,是否關閉注釋的快取,需要區別對待。

是快取,都存在過期,以及更新策略等。

而opcache的更新策略非常簡單,到期資料置為wasted,達到設定值,清空快取,重建快取。

這裡需要注意:在高流量的場景下,重建快取是一件非常耗費資源的事兒。

opcache 在建立快取時並不會阻止其他程序讀取。

這會導致大量程序反覆新建快取。所以,不要設定opcache過期時間

每次發布新**時,都會出現反覆新建快取的情況。如何避免呢?

以上內容希望幫助到大家,很多phper在高階的時候總會遇到一些問題和瓶頸,業務**寫多了沒有方向感,不知道該從那裡入手去提公升,對此我整理了一些資料,包括但不限於:分布式架構、高可擴充套件、高效能、高併發、伺服器效能調優、tp6,lar**el,yii2,redis,swoole、swoft、kafka、mysql優化、shell指令碼、docker、微服務、nginx等多個知識點高階高階乾貨需要的可以免費分享給大家,

資料獲取方式:

或   點選這裡直通車

直通車2

簡述hdfs工作原理 HDFS的工作原理

hdfs 的工作原理 hadoop 分布式檔案系統 hdfs 是一種被設計成適合執行在通用硬體上的分布式檔案系統。hdfs 是乙個高度容錯性的系統,適合部署在廉價的 機器上。它能提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。要理解 hdfs 的內部工作原理,首先要理解什麼是分布式 檔案系統。...

ogg mysql的原理 OGG工作原理

一.goldengate介紹 ogg 是一種基於日誌的結構化資料複製軟體 ogg 能夠實現大量交易資料的實時捕捉,變換和投遞,實現源資料庫與目標資料庫的資料同步,保持最少10ms的資料延遲 二.工作原理 三.相關元件 1.manager 負責ogg 整體的監控和管理 1 trail檔案的生成和刪除 ...

SNMP的工作原理

snmp network management protocol,簡單網路管理協議 首先是由ietf的研究小組為了解決internet上的路由器管理問題而提出的。snmp的設計原則是簡單 性和擴充套件性。簡單性是通過資訊型別限制 請求響應或協議而取得。擴充套件性是通過將管理資訊模型與協議 被管理物件...