目錄
什麼是OPcache
安裝Opcache
#ab 測試效果
配置参考
总结
首頁 後端開發 php教程 什麼是OPCache?如何使用OPCache提升PHP的效能?

什麼是OPCache?如何使用OPCache提升PHP的效能?

May 07, 2021 pm 06:47 PM
opcache php

本篇文章帶大家了解OPCache,詳細介紹一下使用OPCache提升PHP的效能的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

什麼是OPCache?如何使用OPCache提升PHP的效能?

對於PHP 這樣的解釋語言來說,每次的運行都會將所有的程式碼進行一次載入解析,這樣一方面的好處就是程式碼隨時都可以進行熱更新修改,因為我們不需要編譯。但這也會帶來一個問題,那就是無法承載過大的訪問量。畢竟每次載入解析再釋放,都會增加 CPU 的負擔,通常一台 8核心16G 的伺服器在2、3000並發左右 CPU 就能達到60%以上的使用率。而且如果你使用的是類似 Laravel 這種大型的框架,效率將會更加低。這個時候,我們通常會透過增加伺服器數量來做負載平衡,從而達到減輕伺服器壓力的效果。不過,這樣做的成本又會增加許多。那麼,有沒有什麼優化的方案呢?

鳥哥在他的部落格中針對 PHP7 的最佳化的一篇文章中,第一個建議就是開啟 OPcache 。當然,另一個方案就是使用 Swoole 。關於 Swoole 的內容我們將來再說,今天,我們先學習學習 OPcache 。

什麼是OPcache

OPcache 透過將PHP 腳本預編譯的字節碼儲存到共享記憶體中來提升PHP 的效能, 儲存預編譯字位址的好處就是省去了每次載入和解析PHP 腳本的開銷。

這是PHP 文件中關於OPcache 的簡介,也就是說,OPcache 節約了每次載入和解析的步驟,將第一次解析編譯後的腳本字節碼快取到系統的共享記憶體中。其實,這就類似一個不完全的編譯。

類似 Java 之類的語言,都是要打包編譯之後才能上線運行的,例如打包成一個 jar套件 。 C 或 C# 可以打包成一個 .dll 或 .exe 。這些打包之後的文件就是編譯完成的文件,將它們運行起來後一般會一直保持運行狀態,也就是會成為一個常駐進程,它們的程式碼就進入內存中了。在程式運行的時候,不需要再進行解釋或編譯,自然速度就要快很多。而 OPcache 也是起到類似的作用。只不過它並不是完全的一套編譯流程,我們還是依賴的PHP-FPM 來運行腳本,只不過在開啟OPcache 後,PHP-FPM 會先從內存中查找是否已經有相關的已經緩存的字節碼在記憶體中了,如果有的話就直接取用,如果沒有的話,會再進行解釋編譯後快取下來。另外,OPcache 是針對文件的,也就是說,一個文件如果是新增加進來的,只有運行過它才會緩存,如果沒有運行過,它並不在當前的共享內存中。

推薦學習:《PHP影片教學

安裝Opcache

OPcache 已經是PHP 的正式擴充並隨安裝套件一起發布了,所以,我們可以在編譯安裝PHP 時使用--enable-opcache 來開啟擴展,它已經是預設擴展。也可以在未安裝 OPcache 的系統中使用安裝包中的檔案來進行安裝。

cd php-7.4.4/ext/opcache/
phpize
./configure
make && make install
登入後複製

要注意的是, OPcache 和 Xdebug 在生產環境中盡量不要一起使用。本身 Xdebug 就是不建議在生產環境中使用的,如果一定需要同時使用的話,需要先載入 OPcache ,然後再載入 Xdebug 。

擴充安裝後,在 php.ini 檔案中開啟擴充功能。要注意的是,OPcache 擴充是 Zend 擴充包,所以我們需要打開的是 Zend 擴充。

zend_extension=opcache.so
登入後複製

另外,還需要啟用它。

opcache.enable=1
登入後複製

當開啟了 OPcache 之後,我們再更新程式碼將會發現剛剛更新的程式碼不是我們最新的程式碼。這是因為程式碼已經被快取了,就像 Java 一樣,我們需要重新啟動服務才行。那麼 PHP 這邊重啟的是什麼呢?當然就是重啟下我們的 PHP-FPM 就可以了,直接使用 kill -USR2 指令去重啟主程序就行了。這裡也給出一個快速重啟的命令。

ps -ef | grep "php-fpm: master" | grep -v grep | cut -c 9-15 | xargs kill -USR2
登入後複製

感謝知乎大佬的指正,重啟PHP-FPM 不是最佳方案,應該使用opcache_reset() 手動重啟,或透過php.ini 檔案的設定opcache.validate_timestamps opcache.revalidate_freq 自動自動間隔編譯,或透過opcache_compile_file() 直接重新編譯修改的檔案

#ab 測試效果

我們進行測試的內容是測試環境的一台2核心4G的伺服器,使用的PHP 版本是PHP7.4 ,正常的Nginx 及PHP 配置, ulimit 也都開到了最大。程式碼只是簡單的輸出了一行文字,不過我們使用的是一個簡單的 mvc 框架 ,也就是說這段程式碼運行起來至少也會加載幾個文件,而不是簡簡單單的一個文件。

首先我们来看未开启 OPcache 的情况。

什麼是OPCache?如何使用OPCache提升PHP的效能?

接下来是开启了 OPcache 的情况。

什麼是OPCache?如何使用OPCache提升PHP的效能?

很明显,性能有了很大的提高。不仅速度快了很多,吞吐率也是直接上升了几倍。当然,这只是非常简单的一个测试,不过总体看来,确实对单机的性能提升有很大的帮助。最最主要的是,同样的并发情况下,CPU 资源也比未开启的状态下低了70%。

配置参考

在 PHP 的官方文档中,已经为我们给出了一套默认的 OPcache 在 php.ini 中的配置。经过测试,基本没什么问题,当然,现在还没有在生产环境中使用过,还需要进行更多的测试。不过文档中指出,这套配置是可以直接运用到线上的,不过需要注意的是某些使用了注解之类功能的高级框架可能需要注意某些参数。

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
登入後複製

具体的配置说明以及其他的一些配置选项我们可以参考官方文档进行详细的了解。

总结

既然是我们的 PHP 大神鸟哥推荐的,而且也是官方推荐的扩展,我觉得在正式生产环境中使用不会有太大问题。另外,官方也给出了一套可以直接运用于线上生产环境的配置参数,也方便我们直接在线上进行测试。目前在生产环境中,我们只使用了一台服务器来进行测试,并且给它多分配了一些负载过来,从目前的情况来看,这一台机器的运行效率比其他几台的高很多。因为它一方面处理了更多的请求,另一方面它的 CPU 资源占用率还没有其他几台机器高。同时,OPcache 也不需要我们去了解更多的进程协程之类的知识,不像 Swoole 一样的会带来更高的学习成本。所以综上所述,在测试完备的情况下,OPcache 绝对是我们最优先考虑的单机优化方案。

更多编程相关知识,请访问:编程入门!!

以上是什麼是OPCache?如何使用OPCache提升PHP的效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles