這篇文章為大家帶來了關於PHP opcache的相關知識,其中主要給大家聊一聊如何理解OPCache 功能,並且如何使用它,感興趣的朋友下面一起來看一下吧,希望對大家有幫助。
PHP專案中,尤其是在高並發大流量的場景中,如何提升PHP的回應時間,是一項十分重要的工作。
而Opcache又是優化PHP效能不可缺少的元件,尤其是應用了PHP框架的專案中,作用更是明顯。
1、概述
在理解 OPCache 功能之前,我們必須先理解PHP-FPM Nginx 的工作機制,以及PHP腳本解釋執行的機制。
1.1 PHP-FPM Nginx 的工作機制
請求從網頁瀏覽器到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-FPM master 程式接收到請求
- #分配Worker進程執行PHP腳本,如果沒有空閒的Worker,回傳502錯誤
- Worker(php-cgi)進程執行PHP腳本,如果逾時,回傳504錯誤
處理結束,回傳結果
第五步:PHP-FPM Worker => Master => ; Nginx
- PHP-FPM Worker 程序返回處理結果,並關閉連接,等待下一個請求
##PHP-FPM Master進程透過Socket 回傳處理結果
Nginx Handler順序將每一個回應buffer傳送給第一個filter → 第二個→ 以此類推→ 最終回應傳送給客戶端
1.2 PHP腳本解釋執行的機制了解了PHP Nginx 整體的處理流程後,我們接下來看一下PHP腳本具體執行流程,首先我們來看一個實例:
<p><?php <br/> if (!empty($_POST)) {<br> echo "Response Body POST: ", json_encode($_POST), "\n";<br> }<br> if (!empty($_GET)) { <br> echo "Response Body GET: ", json_encode($_GET), "\n";<br> }<br></p>
我們分析執行過程:
1.php初始化執行環節,啟動Zend引擎,載入註冊的擴充模組
2.初始化後讀取腳本文件,Zend引擎對腳本檔案進行詞法分析(lex),語法分析(bison),產生語法樹
3.Zend 引擎編譯語法樹,產生opcode,
4.Zend 引擎執行opcode,傳回執行結果
在PHP cli模式下,每次執行PHP腳本,四個步驟都會依序執行一遍;在PHP-FPM模式下,步驟1)在PHP-FPM啟動時執行一次,後續的請求中不再執行;步驟2)~4)每個請求都要執行一遍;
- 當然有,如:
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 系統提供許多進程間記憶體共享的方式:
1.System-V shm API: System V共享記憶體
sysv shm是持久化的,除非被一個進程明確的刪除,否則它始終存在於記憶體裡,直到系統關機;
2.mmap API:
#mmap映射的內存在不是持久化的,如果進程關閉,映射隨即失效,除非事先已經映射到了一個檔案上
記憶體映射機制mmap是POSIX標準的系統調用,有匿名映射和檔案映射兩種
- ##mmap的一大優點是把檔案對應到行程的位址空間
- 避免了資料從使用者緩衝區到核心page cache緩衝區的複製過程;
- 當然還有一個優點就是不需要頻繁的read/write系統呼叫
System V 的共享記憶體是過時的, POSIX共享記憶體提供了使用更簡單、設計更合理的API.
當Wasted記憶體大於設定值時,自動重新啟動OPCache機制,清空並重新產生快取。
共享記憶體:一個單位時間內,只允許一個程序執行寫入操作,允許多個程序執行讀取操作;寫入操作同時,不阻止讀取操作,以至於很少有鎖死的情況。
這就引發另一個問題:新程式碼、大流量場景,行程排隊執行快取opcode操作;重複寫入,導致資源浪費。
4. OPCache 快取解讀
OPCache 是官方的Opcode 快取解決方案,在PHP5.5版本之後,已經打包到PHP原始碼中一起發布。它將PHP編譯產生的字節碼以及資料快取到共享記憶體中, 在每次請求,從快取中直接讀取編譯後的opcode,進行執行。
透過節省腳本的編譯過程,提高PHP的運作效率。如果正在使用APC擴展,做同樣的工作,現在強烈建議OPCache來代替,尤其是PHP7。
- PHP腳本涉及到的函數
- #PHP腳本中定義的Class
- PHP腳本檔案路徑
- PHP腳本OPArray
- PHP腳本自身結構/內容
快取首先我們需要理解,什麼是Interned String? 在PHP5.4的時候, 引入了Interned String機制, 用於優化PHP對字串的儲存和處理。尤其是處理大塊的字串,例如PHP doces時,Interned String 可以優化記憶體。 Interned String 快取的內容包括:變數名稱、類別名稱、方法名稱、字串、註解等。
但是,像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。預設值2000
opcache.max_file_size=0 以位元組為單位的快取的檔案大小上限。設定為 0 表示快取全部檔案。預設值0
6.3 註解相關的快取
opcache.load_commentsboolean 如果停用,則即使檔案中包含註釋,也不會載入這些註釋內容。本選項可以和 opcache.save_comments 一起使用,以實現按需載入註解內容。
opcache.fast_shutdown boolean 如果啟用,則會使用快速停止續發事件。所謂快速停止續發事件是指依賴 Zend 引擎的記憶體管理模組 一次釋放全部請求變數的內存,而不是依序釋放每一個已分配的記憶體區塊。
6.4 二級快取的設定
#opcache.file_cache 設定二級快取目錄並啟用二級快取。啟用二級快取可以在 SHM 記憶體滿了、伺服器重新啟動或重置 SHM 的時候提高效能。預設值為空字串 "",表示禁用基於檔案的快取。
opcache.file_cache_onlyboolean 啟用或停用在共享記憶體中的 opcode 快取。
opcache.file_cache_consistency_checksboolean 當從檔案快取載入腳本的時候,是否對檔案的校驗和進行驗證。
opcache.file_cache_fallbackboolean 在 Windows 平台上,當一個程序無法附加到共享記憶體的時候, 使用基於檔案的緩存,也即:opcache.file_cache_only=1。需要顯示的啟用檔案快取。
推薦學習:《PHP影片教學》
以上是一文詳解PHP opcache的原理及使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)