搜尋
首頁後端開發php教程什麼是OPCache?如何使用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刪除
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

記事本++7.3.1

記事本++7.3.1

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

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),