PHP專案中,尤其是在高並發大流量的場景中,如何提升PHP的回應時間,是一項十分重要的工作。
而Opcache又是優化PHP效能不可缺少的元件,尤其是應用了PHP框架的專案中,作用更是明顯。
1. 概述
在理解OPCache 功能之前,我們必須先理解PHP-FPM Nginx 的工作機制,以及PHP腳本解釋執行的機制。
1.1 PHP-FPM Nginx 的工作機制
請求從Web瀏覽器到Nginx,再到PHP處理完成,一共要經歷如下五個步驟:
第一步:啟動服務
- #啟動PHP-FPM。 PHP-FPM 支援兩種通訊模式:TCP socket和Unix socket;
- PHP-FPM 會啟動兩種類型的進程: Master 進程和Worker 進程,前者負責監控連接埠、指派任務、管理Worker進程;後者就是PHP的cgi程序,負責解釋編譯執行PHP腳本。
- 啟動Nginx。 首先會載入ngx_http_fastcgi_module 模組,初始化FastCGI執行環境,實作FastCGI協定請求代理
- 這裡要注意:fastcgi的worker進程(cgi進程),是由PHP-FPM來管理,不是Nginx。 Nginx只是代理
第二步:Request => Nginx
- Nginx 接收請求,並基於location配置,選擇一個合適handler
- 這裡就是代理PHP的handler
第三步:Nginx => PHP-FPM
- ##Nginx 把請求翻譯成fastcgi請求
- 透過TCP socket/Unix Socket 傳送給PHP-FPM 的master程序
PHP-FPM master 程序接收到請求
- 分配Worker進程執行PHP腳本,如果
- 沒有空閒的Worker,回傳502錯誤Worker(php-cgi)程序執行PHP腳本,如果
- 逾時,回傳504錯誤處理結束,回傳結果
PHP-FPM Worker 程序傳回處理結果,並關閉連接,等待下一個請求
- PHP-FPM Master 進程透過Socket 回傳處理結果
- Nginx Handler順序將每一個回應buffer傳送給第一個filter → 第二個→ 以此類推→ 最終回應傳送給客戶端
1.2 PHP腳本解釋執行的機制了解了PHP Nginx 整體的處理流程後,我們接下來來看PHP腳本具體執行流程,
首先我們來看一個實例:
<?php if (!empty($_POST)) { echo "Response Body POST: ", json_encode($_POST), "\n"; } if (!empty($_GET)) { echo "Response Body GET: ", json_encode($_GET), "\n"; }
我們來分析執行過程:
-
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模式下,每次請求都要處理一遍,是對系統資源極大的浪費,那麼有沒有辦法優化呢?
當然有,如:
- OPCache:前身是Zend Optimizer ,是Zend Server 的開源元件;官方出品,強力推薦
- APC: Alternative PHP Cache 是一個開放自由的PHP opcode 快取元件,用於快取、最佳化PHP 中間程式碼;已經不更新了不推薦
- APCu:是APC的一個分支,共享內存,快取用戶數據,不能快取opcode ,可以配合Opcache 使用
- eAccelerate:同樣是不更新了,不推薦
- xCache:不再推薦使用了
2. OPCache 介紹
OPCache 是Zend官方出品的,開放自由的opcode 快取擴展,還具有程式碼最佳化功能,省去了每次載入和解析PHP 腳本的開銷。
PHP 5.5.0 及後續版本中已經綁定了 OPcache 擴充。
快取兩類內容:
- OPCode
- Interned String,如註解、變數名稱等
3. OPCache 原理
OPCache快取的機制主要是:將編譯好的操作碼放入共享內存,提供給其他進程存取#。
這裡就牽涉到記憶體共享機制,另外所有記憶體資源操作都有鎖定的問題,我們一一解讀。
3.1 共享記憶體
UNIX/Linux 系統提供許多進程間記憶體共享的方式:
- System-V shm API: System V共享記憶體,
- sysv shm是持久化的,除非被一個行程明確的刪除,否則它總是存在於記憶體裡,直到系統關機;
- mmap API:
- mmap映射的內存在不是持久化的,如果進程關閉,映射隨即失效,除非事先已經映射到了一個文件上
- 內存映射機制mmap是POSIX標準的系統調用,有匿名映射和檔案映射兩種
- mmap的一大優點是把檔案映射到進程的位址空間
- 避免了資料從用戶緩衝區到核心page cache緩衝區的複製過程;
- 當然還有一個優點就是不需要頻繁的read/write系統呼叫
##POSIX API: System V 的共享記憶體是過時的, POSIX共享內存提供了使用更簡單、設計更合理的API. - Unix socket API
當Wasted記憶體大於設定值時,自動重新啟動OPCache機制,清空並重新產生快取。
3.2 互斥鎖定
#任何記憶體資源的操作,都牽涉到鎖的機制。 共享記憶體:一個單位時間內,只允許一個程序執行寫入操作,允許多個程序執行讀取操作;寫入操作同時,不阻止讀取操作,以至於很少有鎖死的情況。 這就引發另一個問題:新程式碼、大流量場景,行程排隊執行快取opcode操作;重複寫入,導致資源浪費。4. OPCache 快取解讀
OPCache 是官方的Opcode 快取解決方案,在PHP5.5版本之後,已經打包到PHP原始碼中一起發布。 它將PHP編譯產生的字節碼以及資料快取到共享記憶體中, 在每次請求,從快取中直接讀取編譯後的opcode,進行執行。 透過節省腳本的編譯過程,提升PHP的運作效率。 如果正在使用APC擴展,做同樣的工作,現在強烈建議OPCache來代替,尤其是PHP7。4.1 OPCode 快取
#Opcache 會快取OPCode以及如下內容:- PHP腳本涉及的函數
- PHP腳本中定義的Class
- PHP腳本檔案路徑
- PHP腳本OPArray ##PHP腳本本身結構/內容
4.2 Interned String 快取
首先我們需要理解,什麼是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等框架中,會引用註釋,所以,是否關閉註釋的緩存,需要區別對待。
5. OPCache 更新策略
是緩存,都存在過期,以及更新策略等。 而OPCache的更新策略非常簡單,到期資料置為Wasted,達到設定值,清空緩存,重建快取。 這裡要注意:在高流量的場景下,重建快取是一件非常耗費資源的事兒。
OPCache 在建立快取時並不會阻止其他進程讀取。 這會導致大量進程反覆新建快取。所以,不要設定OPCache過期時間
每次發布新程式碼時,都會出現重複新建快取的情況。如何避免呢?- 不要在高峰期發布程式碼,這是任何情況下都要遵守的規則 程式碼預熱,例如使用腳本批次調PHP 存取URL,或使用OPCache 暴露的API 如
- opcache_compile_file()
進行編譯快取
#6.1 記憶體配置
- #opcache.preferred_memory_model="mmap"
- OPcache 首選的記憶體模組。如果留空,OPcache 會選擇適用的模組, 通常情況下,自動選擇就可以滿足需求。可選值包括:
mmap
,shm
,posix
以及win32
。 opcache.memory_consumption=64 - OPcache 的共享記憶體大小,以兆位元組為單位,預設
64M
#opcache.interned_strings_buffer =4 - 用來儲存臨時字串的記憶體大小,以兆位元組為單位,預設
4M
opcache.max_wasted_percentage=5 - 浪費記憶體的上限,以百分比計。如果達到此上限,那麼 OPcache 將產生重新啟動續發事件。預設
5
6.2 允許快取的檔案數以及大小
##opcache .max_accelerated_files=2000- OPcache 哈希表中可儲存的腳本檔案數量上限。真實的取值是在質數集合
- { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 }
中找到的第一個等於設定值的質數大於設定值的質數。設定值取值範圍最小值是
200,最大值在 PHP 5.5.6 之前是
100000,PHP 5.5.6 及之後是
1000000。預設值
2000opcache.max_file_size=0
以位元組為單位的快取的檔案大小上限。設定為 0 表示快取全部檔案。預設值0
opcache.load_comments
- boolean
如果停用,則即使文件中包含註釋,也不會載入這些註釋內容。本選項可以和
opcache.save_comments一起使用,以實現按需載入註解內容。
opcache.fast_shutdown
boolean 如果啟用,則會使用快速停止續發事件。所謂快速停止續發事件是指依賴 Zend 引擎的記憶體管理模組 一次釋放全部請求變數的內存,而不是依序釋放每一個已分配的記憶體區塊。
# 推薦學習:《PHP影片教學》
opcache.file_cache
設定二級快取目錄並啟用二級快取。啟用二級快取可以在 SHM 記憶體滿了、伺服器重新啟動或重置 SHM 的時候提高效能。預設值為空字串 ""
,表示停用基於檔案的快取。 opcache.file_cache_only
boolean
啟用或停用在共享記憶體中的 opcode 快取。 opcache.file_cache_consistency_checks
boolean
當從檔案快取載入腳本的時候,是否對檔案的校驗和進行驗證。 opcache.file_cache_fallback
boolean
在Windows 平台上,當一個行程無法附加到共享記憶體的時候, 使用基於檔案的緩存,也即: opcache.file_cache_only=1
。需要顯示的啟用檔案快取。
以上是深入分析PHP Opcache工作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

HTTP緩存頭的關鍵玩家包括Cache-Control、ETag和Last-Modified。 1.Cache-Control用於控制緩存策略,示例:Cache-Control:max-age=3600,public。 2.ETag通過唯一標識符驗證資源變化,示例:ETag:"686897696a7c876b7e"。 3.Last-Modified指示資源最後修改時間,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

PHP在過去幾十年中塑造了網絡,並將繼續在Web開發中扮演重要角色。 1)PHP起源於1994年,因其易用性和與MySQL的無縫集成成為開發者首選。 2)其核心功能包括生成動態內容和與數據庫的集成,使得網站能夠實時更新和個性化展示。 3)PHP的廣泛應用和生態系統推動了其長期影響,但也面臨版本更新和安全性挑戰。 4)近年來的性能改進,如PHP7的發布,使其能與現代語言競爭。 5)未來,PHP需應對容器化、微服務等新挑戰,但其靈活性和活躍社區使其具備適應能力。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版
中文版,非常好用

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器