php網(wǎng)站訪問(wèn)量大怎么優(yōu)化(php大流量網(wǎng)站怎么優(yōu)化)
我讓反應(yīng)遲鈍的網(wǎng)問(wèn)量PHP應(yīng)用程序性能提升了4倍,而且我甚至沒(méi)有改動(dòng)任何源代碼沒(méi)有重構(gòu),站訪站優(yōu)沒(méi)有重寫(xiě),大優(yōu)大流只是化p化進(jìn)行了一系列精心規(guī)劃的配置調(diào)整和部署優(yōu)化這篇文章將詳細(xì)告訴你我是如何做到的如果你的PHP應(yīng)用程序運(yùn)行緩慢,你可能會(huì)驚訝地發(fā)現(xiàn)性能還有如此大的量網(wǎng)提升空間。
開(kāi)發(fā)者常常把問(wèn)題歸咎于代碼本身,網(wǎng)問(wèn)量但實(shí)際上,站訪站優(yōu)在很多情況下,大優(yōu)大流瓶頸出在環(huán)境和配置上下面我將分步驟詳細(xì)說(shuō)明我是化p化如何實(shí)現(xiàn)這個(gè)性能提升的問(wèn)題:一個(gè)緩慢但穩(wěn)定的PHP應(yīng)用我有一個(gè)老的PHP應(yīng)用程序(Laravel 7版本),用于管理內(nèi)部庫(kù)存的量網(wǎng)小型工具。
幾個(gè)月來(lái)代碼庫(kù)都沒(méi)有變動(dòng),網(wǎng)問(wèn)量但用戶們開(kāi)始抱怨:頁(yè)面加載時(shí)間逐漸增加到3-5秒,站訪站優(yōu)有時(shí)甚至?xí)瑫r(shí)以下是大優(yōu)大流基本配置:PHP 7.4Apache 2.4Laravel 7MySQL 5.7運(yùn)行在每月10美元的VPS上(1核CPU,1GB內(nèi)存)
通過(guò)Git部署,化p化使用HTTPS提供服務(wù)初始基準(zhǔn)測(cè)試:ab -n 100 -c 10 https://example.com/dashboard # 測(cè)試結(jié)果:平均響應(yīng)時(shí)間5.2秒對(duì)于這樣一個(gè)相對(duì)簡(jiǎn)單的量網(wǎng)儀表盤(pán)來(lái)說(shuō),這個(gè)速度實(shí)在是太慢了。
第一步:?jiǎn)⒂貌?yōu)化OPcache什么是OPcache?OPcache是PHP的字節(jié)碼緩存,它將預(yù)編譯的腳本字節(jié)碼存儲(chǔ)在共享內(nèi)存中這樣就無(wú)需在每次請(qǐng)求時(shí)都加載和解析腳本啟用OPcache檢查OPcache是否已啟用:。
如果沒(méi)有啟用,可以在php.ini中進(jìn)行配置:zend_extension=opcache.so opcache.enable=1opcache.memory_consumption
=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=10000opcache.revalidate_freq=0小貼士:
_opcache.revalidate_freq=0_確保文件只在每次請(qǐng)求時(shí)檢查一次(如果文件未被修改則無(wú)需重復(fù)檢查)啟用OPcache后的效果zend_extension=opcache.so opcache.enable。
=1opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=10000opcache.revalidate_freq
=0僅通過(guò)OPcache就實(shí)現(xiàn)了近40%的性能提升第二步:用Nginx+PHP-FPM替換ApacheApache雖然功能強(qiáng)大,但對(duì)于高并發(fā)的PHP應(yīng)用來(lái)說(shuō)有點(diǎn)臃腫我用Nginx和PHP-FPM替換了Apache。
為什么選擇Nginx?Nginx是基于事件的服務(wù)器,針對(duì)靜態(tài)和動(dòng)態(tài)內(nèi)容的服務(wù)進(jìn)行了高度優(yōu)化它占用資源更少,處理并發(fā)請(qǐng)求的能力更強(qiáng)配置示例(nginx.conf)zend_extension=opcache.so 。
opcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files
=10000opcache.revalidate_freq=0別忘了禁用Apache以釋放80端口和相關(guān)資源使用Nginx后的效果ab -n 100 -c 10 https://example.com/dashboard 。
# 測(cè)試結(jié)果:平均響應(yīng)時(shí)間2.0秒現(xiàn)在我們看到了顯著的性能提升第三步:?jiǎn)⒂肏TTP/2和Gzip壓縮Gzip壓縮在Nginx配置中添加以下內(nèi)容:gzipon; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;。
HTTP/2更新listen指令:listen 443 ssl http2;這需要SSL證書(shū)(我使用的是Lets Encrypt)啟用Gzip+HTTP/2后的效果ab -n 100 -c 10 https://example.com/dashboard 。
# 測(cè)試結(jié)果:平均響應(yīng)時(shí)間1.6秒又獲得了顯著的性能提升,特別是對(duì)于靜態(tài)資源和大數(shù)據(jù)量的傳輸?shù)谒牟剑菏褂谜嬲腜HP會(huì)話驅(qū)動(dòng)Laravel默認(rèn)使用基于文件的會(huì)話存儲(chǔ),在單線程磁盤(pán)VPS上負(fù)載較高時(shí)表現(xiàn)很差。
切換到RedisSESSION_DRIVER=redis CACHE_DRIVER=redis同時(shí)相應(yīng)地更新了config/database.php和config/session.php文件架構(gòu)圖+--------+ +------------+ +-----------+ 。
| 客戶端 | | Nginx | | PHP-FPM | +--------+ +------------+ +-----------+
| || v +--------+ +--------+ |
Redis | | MySQL | +--------+ +--------+使用Redis會(huì)話驅(qū)動(dòng)后的效果ab -n 100 -c
10 https://example.com/dashboard # 測(cè)試結(jié)果:平均響應(yīng)時(shí)間1.3秒響應(yīng)時(shí)間已經(jīng)減少到原來(lái)的約四分之一額外技巧:Cloudflare+頁(yè)面規(guī)則(再次零代碼改動(dòng))如果你使用自定義域名,將你的站點(diǎn)添加到Cloudflare并創(chuàng)建緩存規(guī)則:。
緩存所有內(nèi)容邊緣緩存TTL:1小時(shí)瀏覽器緩存TTL:遵循現(xiàn)有頭部這可以將靜態(tài)頁(yè)面直接推送到CDN邊緣節(jié)點(diǎn),減輕服務(wù)器負(fù)載在某些情況下,我看到來(lái)自遙遠(yuǎn)地區(qū)的頁(yè)面加載時(shí)間縮短到了亞秒級(jí)結(jié)論:不要總是歸咎于代碼。
在進(jìn)行PHP函數(shù)性能分析或重寫(xiě)框架之前,先問(wèn)問(wèn)自己:你是否充分利用了緩存?你的會(huì)話存儲(chǔ)是否優(yōu)化?你的Web服務(wù)器配置是否拖了后腿?你的靜態(tài)資源是否經(jīng)過(guò)壓縮并高效傳輸?在我的案例中,這些簡(jiǎn)單的基礎(chǔ)設(shè)施層面的調(diào)整就足以讓?xiě)?yīng)用程序性能飛升,而且我一行代碼都沒(méi)改。