php刷新當(dāng)前網(wǎng)頁的代碼PHP解釋型語言來說什么優(yōu)化的方案?|PHP課堂網(wǎng)頁js自動刷新代碼
2022-08-02
對于 PHP 等解釋型語言,每次運行都會加載和解析一次所有代碼。這樣做的好處是代碼可以隨時更新和修改,因為我們不需要編譯。但這也帶來了一個問題,就是不能承載過多的流量。畢竟每次加載、解析、釋放,都會增加CPU的負(fù)擔(dān)。通常一臺8核16G的服務(wù)器,在2、3000并發(fā)量左右,可以達(dá)到60%以上的CPU利用率。而且,如果您使用的是像這樣的大型框架,它的效率會更低。這時候我們通常通過增加服務(wù)器數(shù)量來做負(fù)載均衡,從而達(dá)到降低服務(wù)器壓力的效果。但是,這樣做的成本會增加很多。那么,有沒有優(yōu)化的解決方案呢?
鳥哥在他的博客中一篇關(guān)于PHP7優(yōu)化的文章中,第一個建議是開啟它。當(dāng)然,另一種選擇是使用 . 我們將在未來討論內(nèi)容。今天php刷新當(dāng)前網(wǎng)頁的代碼,我們先來學(xué)習(xí)。
什么是
通過將 PHP 腳本的預(yù)編譯字節(jié)碼存儲在共享內(nèi)存中,可以提高 PHP 的性能。存儲預(yù)編譯字節(jié)碼的好處是節(jié)省了每次加載和解析 PHP 腳本的開銷。
這是PHP文檔中的介紹,即保存每個加載和解析步驟,并將第一次解析后編譯的腳本字節(jié)碼緩存在系統(tǒng)的共享內(nèi)存中。實際上,這類似于不完整的編譯。
像Java這樣的語言需要打包編譯才能上線運行,比如打包成jar包。C++ 或 C# 可以打包成 .dll 或 .exe。這些打包的文件就是編譯后的文件。運行它們后,它們一般會保持在運行狀態(tài),即它們會成為一個常駐進(jìn)程,它們的代碼會進(jìn)入內(nèi)存。程序運行時,無需解釋或編譯,自然速度會快很多。但也扮演著類似的角色。只是它不是一套完整的編譯過程。我們?nèi)匀灰蕾?PHP-FPM 來運行腳本,但是在開啟之后,PHP-FPM 會首先檢查內(nèi)存中是否已經(jīng)有相關(guān)的緩存字節(jié)碼。內(nèi)存中,有的話直接使用。如果不,它將被再次解釋和編譯,然后緩存。另外,它是針對文件的,也就是說,如果一個文件是新添加的,它只有在運行之后才會被緩存。如果尚未運行,則不在當(dāng)前共享內(nèi)存中。
安裝
它已經(jīng)是 PHP 的官方擴展,并隨安裝包一起發(fā)布,所以我們可以在編譯安裝 PHP 時使用 --- 來啟用擴展,它已經(jīng)是默認(rèn)擴展了。它也可以使用安裝包中的文件安裝在未安裝的系統(tǒng)上。
cd?php-7.4.4/ext/opcache/phpize./configuremake?&&?make?install
需要注意的是,盡量不要和生產(chǎn)環(huán)境一起使用。不建議在生產(chǎn)環(huán)境中使用。如果一定要同時使用,需要先加載再加載。
安裝擴展后,打開 php.ini 文件中的擴展。需要注意的是,擴展是一個Zend擴展包,所以我們需要打開的是Zend擴展。
zend_extension=opcache.so
此外,它需要啟用。
opcache.enable=1
開啟后,如果我們再次更新代碼,我們會發(fā)現(xiàn)剛剛更新的代碼并不是我們最新的代碼。這是因為代碼已經(jīng)被緩存了,就像在Java中一樣,我們需要重新啟動服務(wù)。那么這里重啟 PHP 是什么?當(dāng)然,只要重啟我們的PHP-FPM,使用kill -USR2命令重啟主進(jìn)程即可。這里還給出了快速重啟命令。
ps?-ef?|?grep?"php-fpm:?master"?|?grep?-v?grep?|?cut?-c?9-15?|?xargs?kill?-USR2
感謝知乎的指正。重啟 PHP-FPM 并不是最好的解決方案。您應(yīng)該使用 () 手動重啟,或配置 . + . 在php.ini文件中間隔自動編譯,或者使用()直接重新編譯修改過的那些文件
ab測試效果
我們測試的內(nèi)容是測試環(huán)境中的2核4G服務(wù)器。使用的 PHP 版本是 PHP7.4。正常和 PHP 配置也被打開到最大。代碼只是簡單地輸出了一行文本,但是我們使用的是一個簡單的mvc框架,這意味著這段代碼在運行時會加載至少幾個文件,而不僅僅是一個文件。
首先,讓我們看一下未開封的箱子。
接下來是開箱。
很明顯php刷新當(dāng)前網(wǎng)頁的代碼,性能有了很大的提升。不僅速度快了很多,吞吐率也直接提升了好幾倍。當(dāng)然,這只是一個非常簡單的測試,但總的來說,對于提升單機性能確實有很大幫助。最重要的是,在同等并發(fā)情況下,CPU資源也比未打開狀態(tài)下降低了70%。
配置參考
在 PHP 的官方文檔中,已經(jīng)給我們提供了 php.ini 中的一組默認(rèn)配置。經(jīng)測試,基本沒有問題。當(dāng)然,目前還沒有在生產(chǎn)環(huán)境中使用,還需要更多的測試。不過文檔指出,這種配置可以直接在網(wǎng)上應(yīng)用,但是需要注意的是網(wǎng)站優(yōu)化網(wǎng)站模板,一些使用注解等功能的高級框架可能需要注意某些參數(shù)。
opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.revalidate_freq=60opcache.fast_shutdown=1opcache.enable_cli=1
具體的配置說明和其他配置選項,我們可以參考官方文檔詳細(xì)了解。
總結(jié)
既然是我們PHP大鳥哥推薦的,而且也是官方推薦的擴展,我覺得在官方生產(chǎn)環(huán)境中使用不會有什么大問題。此外,官方還提供了一組配置參數(shù),可以直接應(yīng)用于在線生產(chǎn)環(huán)境,也方便我們直接在線測試。目前,在生產(chǎn)環(huán)境中,我們只使用一臺服務(wù)器進(jìn)行測試,并為其分配更多的負(fù)載。從目前的情況來看,這臺機器的運行效率遠(yuǎn)高于其他機器。因為它一方面處理更多的請求,另一方面它的CPU資源使用率并沒有其他幾臺機器那么高。同時,我們也不需要多學(xué)習(xí)進(jìn)程協(xié)程之類的,這將帶來更高的學(xué)習(xí)成本。所以綜上所述,在完整測試的情況下,絕對是我們最優(yōu)先的單機優(yōu)化方案。
參考文檔: