首頁  >  文章  >  後端開發  >  什麼是OPCache?如何使用OPCache提升PHP的效能?

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

青灯夜游
青灯夜游轉載
2021-05-07 18:47:226213瀏覽

本篇文章帶大家了解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中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除