




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第PHP細(xì)數(shù)實(shí)現(xiàn)提高并發(fā)能力的方法目錄內(nèi)存優(yōu)化開(kāi)啟ZendOPcache性能加速文件上傳執(zhí)行時(shí)間處理會(huì)話(huà)緩沖區(qū)安全設(shè)置本文已收錄編程學(xué)習(xí)筆記gitee。涵蓋PHP、JavaScript、Linux、Golang、MySQL、Redis和開(kāi)源工具等等相關(guān)內(nèi)容。
用于生產(chǎn)環(huán)境中的PHP需要對(duì)其進(jìn)行優(yōu)化,讓PHP自身發(fā)揮更好的性能,除了寫(xiě)好PHP代碼,還要配置好php-fpm以及php.ini調(diào)優(yōu)。本文從內(nèi)存、OPcache、上傳、會(huì)話(huà)以及安全等方面講解php.ini的配置調(diào)優(yōu)。
PHP相對(duì)其他的編譯性語(yǔ)言,最大的缺點(diǎn)在于每次請(qǐng)求都會(huì)去做一些模塊解析,真正執(zhí)行的是work進(jìn)程。work進(jìn)程的開(kāi)啟需要消耗更多的資源。同時(shí),來(lái)一個(gè)請(qǐng)求都會(huì)去重新解析一些代碼,導(dǎo)致重復(fù)解析。
對(duì)于PHP的優(yōu)化,可以重點(diǎn)充這方面去考慮進(jìn)行優(yōu)化。
內(nèi)存優(yōu)化
運(yùn)行PHP時(shí)需要關(guān)心每個(gè)PHP進(jìn)程要使用多少內(nèi)存,php.ini中的memory_limit設(shè)置用于設(shè)定單個(gè)PHP進(jìn)程可以使用的系統(tǒng)內(nèi)存最大值。
這個(gè)設(shè)置的默認(rèn)值是128M,這對(duì)于大多數(shù)中小型PHP應(yīng)用來(lái)說(shuō)或許合適,不過(guò),如果運(yùn)行的是微型PHP應(yīng)用,可以降低這個(gè)值,以便節(jié)省系統(tǒng)資源,反之,如果運(yùn)行的是內(nèi)存集中型PHP應(yīng)用,可以增加這個(gè)值。這個(gè)值的大小由可用的系統(tǒng)內(nèi)存決定,確定給PHP分配多少值是一門(mén)藝術(shù),決定給PHP分配多少內(nèi)存,以及能負(fù)擔(dān)起多少個(gè)PHP-FPM進(jìn)程時(shí),可以根據(jù)以下維度信息進(jìn)行判斷:
一共可以分配給PHP多少內(nèi)存?以一個(gè)2G內(nèi)存的VPS為例,這臺(tái)設(shè)備中可能還運(yùn)行了其他進(jìn)程,如MySQL、Nginx等,那么留512M給PHP是合適的。每個(gè)PHP進(jìn)程平均耗費(fèi)多少內(nèi)存?這個(gè)要監(jiān)控進(jìn)程的內(nèi)存使用量,可以使用命令行命令top,也可以在PHP腳本中調(diào)用memory_get_peak_usage()函數(shù),不管使用哪種方式,都要多次運(yùn)行同一個(gè)腳本,然后取內(nèi)存消耗的平均值。能負(fù)擔(dān)起多少個(gè)PHP-FPM進(jìn)程?假設(shè)我給PHP分配了512M內(nèi)存,每個(gè)PHP進(jìn)程平均耗費(fèi)15M內(nèi)存,那么可以負(fù)擔(dān)起34個(gè)PHP-FPM進(jìn)程。
有足夠的系統(tǒng)資源嗎?最后還需要確認(rèn)有足夠的系統(tǒng)資源運(yùn)行PHP應(yīng)用并處理預(yù)期的流量。具體的PHP配置信息可以參考php-fpm.config配置文件。
;Timelimitforchildprocessestowaitforareactiononsignalsfrommaster.
;Availableunits:s(econds),m(inutes),h(ours),ord(ays)
;DefaultUnit:seconds
;DefaultValue:0
;process_control_timeout=0
;ThemaximumnumberofprocessesFPMwillfork.Thishasbeendesignedtocontrol
;theglobalnumberofprocesseswhenusingdynamicPMwithinalotofpools.
;Useitwithcaution.
;Note:Avalueof0indicatesnolimit
;DefaultValue:0
;process.max=128
;Specifythenice(2)prioritytoapplytothemasterprocess(onlyifset)
;Thevaluecanvaryfrom-19(highestpriority)to20(lowestpriority)
;Note:-ItwillonlyworkiftheFPMmasterprocessislaunchedasroot
;-Thepoolprocesswillinheritthemasterprocesspriority
;unlessspecifiedotherwise
;DefaultValue:noset
;process.priority=-19
;SendFPMtobackground.SettonotokeepFPMinforegroundfordebugging.
;DefaultValue:yes
daemonize=no
php-fpm有三種運(yùn)行模式,分別是固定進(jìn)程數(shù)、按需進(jìn)程數(shù)、完全動(dòng)態(tài)進(jìn)程數(shù)。
按需進(jìn)程數(shù),默認(rèn)初始化幾個(gè)進(jìn)程數(shù),如果進(jìn)去量過(guò)大,動(dòng)態(tài)創(chuàng)建一些新的進(jìn)程數(shù),等請(qǐng)求結(jié)束之后,新創(chuàng)建的進(jìn)程數(shù)在銷(xiāo)毀掉。固定進(jìn)程數(shù),默認(rèn)固定幾個(gè)進(jìn)程,如果進(jìn)程數(shù)不夠的情況時(shí),新的請(qǐng)求處于等待中,直到其他的進(jìn)程處理完畢才會(huì)處理新的請(qǐng)求。完全動(dòng)態(tài)進(jìn)程數(shù),表示完全由請(qǐng)求量控制,來(lái)一個(gè)請(qǐng)求創(chuàng)建一個(gè)進(jìn)程,處理完畢在銷(xiāo)毀掉。
開(kāi)啟ZendOPcache性能加速
確定要分配多少內(nèi)存后,就可以配置PHP的ZendOPcache擴(kuò)展。OPcache主要是將一些代碼解析成字節(jié)碼,在后續(xù)的請(qǐng)求中就無(wú)需重復(fù)去解析、編譯這部分代碼。減少編譯、解析的過(guò)程,也能提高PHP的處理速度。
PHP5.5.0+內(nèi)置了這個(gè)擴(kuò)展,下面羅列幾項(xiàng)必要的配置信息:
opcache.memory_consumption=64:為操作碼緩存分配的內(nèi)存(單位是MB),分配的內(nèi)存量應(yīng)該可以保存應(yīng)用中所有PHP腳本編譯得到的操作碼,這個(gè)值根據(jù)應(yīng)用的體量可以設(shè)置成不同大小的值。
erned_strings_buffer=16:用來(lái)存儲(chǔ)駐留字符串的內(nèi)存量(單位是MB),什么是駐留字符串呢?PHP解釋器在背后會(huì)找到相同字符串的多個(gè)實(shí)例,把這個(gè)字符串保存在內(nèi)存中,如果再次使用相同的字符串,PHP解釋器會(huì)使用指針,這么做的目的是節(jié)省內(nèi)存。默認(rèn)情況下,PHP駐留字符串會(huì)隔離在各個(gè)PHP進(jìn)程中,這個(gè)設(shè)置能讓PHP-FPM進(jìn)程池把所有進(jìn)程駐留字符串存儲(chǔ)到共享的緩沖區(qū)中,以便在PHP-FPM進(jìn)程池中的多個(gè)進(jìn)程之間引用駐留字符串,這樣能節(jié)省更多內(nèi)存。
opcache.max_accelerated_files=4000:操作碼緩存中最多能存儲(chǔ)多少個(gè)PHP腳本,這個(gè)值的區(qū)間是2000到100000之間,這個(gè)值一定要比PHP應(yīng)用中的文件數(shù)大。
opcache.validate_timestamps=1:這個(gè)設(shè)置的值為1時(shí),經(jīng)過(guò)一段時(shí)間后PHP會(huì)檢查PHP腳本的內(nèi)容是否有變化,檢查的時(shí)間間隔由opcache.revalidate_freq設(shè)置指定。如果這個(gè)設(shè)置的值為0,PHP不會(huì)檢查PHP腳本的內(nèi)容是否有變化,我們必須自己動(dòng)手清除緩存的操作碼。建議在開(kāi)發(fā)環(huán)境中設(shè)置為1,生產(chǎn)環(huán)境中設(shè)置為0。
opcache.revalidate_freq=0:設(shè)置多久(單位是秒)檢查一次PHP腳本內(nèi)容是否有變化。設(shè)置為0秒的含義是僅當(dāng)opcache.validate_timestamps設(shè)置為1時(shí),才會(huì)在每次請(qǐng)求時(shí)都重新驗(yàn)證PHP文件,因此,在開(kāi)發(fā)環(huán)境中每次都會(huì)重新驗(yàn)證PHP文件,在生產(chǎn)環(huán)境中則不驗(yàn)證。
opcache.fast_shutdown=1:這么設(shè)置能讓操作碼使用更快的停機(jī)步驟,把對(duì)象析構(gòu)和內(nèi)存釋放交給ZendEngine的內(nèi)存管理器完成。
文件上傳
如果你的應(yīng)用允許上傳文件,最好設(shè)置最大能上傳的文件大小。除此之外,最好還要設(shè)置最多能同時(shí)上傳多少個(gè)文件:
file_uploads=1
upload_max_filesize=10M
max_file_uploads=3
默認(rèn)情況下,PHP允許在單次請(qǐng)求中上傳20個(gè)文件,上傳的文件最大為2MB,這里我設(shè)置為單次請(qǐng)求最多只能上傳3個(gè)文件,每個(gè)文件最大為10MB,這個(gè)值不要設(shè)置太大,否則會(huì)出現(xiàn)超時(shí)。
注:如果非要上傳大文件,Web服務(wù)器的配置也要做相應(yīng)調(diào)整。除了在php.ini中設(shè)置之外,還要調(diào)整Nginx虛擬主機(jī)配置中的client_max_body_size設(shè)置。
此外,如果是上傳特大文件,我建議使用Webuploader專(zhuān)門(mén)的上傳組件,前端對(duì)大文件進(jìn)行切片,后端php對(duì)分片數(shù)據(jù)進(jìn)行合并還原文件。有關(guān)WebUploader應(yīng)用請(qǐng)參考本站文章:功能強(qiáng)大的文件上傳組件-WebUploader。
執(zhí)行時(shí)間
max_execution_time用于設(shè)置單個(gè)PHP進(jìn)程在終止之前最長(zhǎng)可運(yùn)行時(shí)間。這個(gè)設(shè)置默認(rèn)是30秒,建議將其設(shè)置為5秒:
max_execution_time=5
在PHP腳本中可以調(diào)用set_limit_time()函數(shù)覆蓋這個(gè)設(shè)置。
假設(shè)我們想要生成報(bào)告,并把結(jié)果制作成PDF文件,這個(gè)任務(wù)可能要花10分鐘才能完成,而我們肯定不想讓PHP請(qǐng)求等待10分鐘,我們應(yīng)該單獨(dú)編寫(xiě)一個(gè)PHP文件,讓其在單獨(dú)的后臺(tái)進(jìn)程中執(zhí)行,Web應(yīng)用只需幾毫秒就可以派生一個(gè)單獨(dú)的后臺(tái)進(jìn)程,然后返回HTTP響應(yīng)。
實(shí)際上,我們?cè)谂苄枰拇罅繒r(shí)間來(lái)完成的任務(wù),一般采用后臺(tái)進(jìn)程方式,比如我們可以使用PHP的swoole擴(kuò)展來(lái)生成報(bào)表、批量發(fā)送郵件耗時(shí)長(zhǎng)的任務(wù)。
處理會(huì)話(huà)
PHP默認(rèn)的情況是將會(huì)話(huà)產(chǎn)生的信息存在磁盤(pán)中,例如所謂的session信息。在創(chuàng)建和讀取session時(shí),都會(huì)對(duì)磁盤(pán)進(jìn)行I/O操作,讀寫(xiě)磁盤(pán)其實(shí)是比較耗時(shí)的一個(gè)操作。并且session不方便做分布式應(yīng)用的會(huì)話(huà)機(jī)制處理。推薦可以放在Redis、memcached這樣的內(nèi)存性服務(wù)中,讀寫(xiě)速度快,并且可以做分布式會(huì)話(huà)機(jī)制處理。
下面舉例將session這樣的信息,存儲(chǔ)在memcached內(nèi)存中。
session.save_handler="memcached"
session.save_path="服務(wù)地址:端口號(hào)"
緩沖區(qū)
如果是在較少的塊中發(fā)送更多數(shù)據(jù),而不是在較多的塊中發(fā)送較少的數(shù)據(jù),那么網(wǎng)絡(luò)的效率會(huì)更高,也就是說(shuō),在較少的片段中把內(nèi)容傳遞給訪(fǎng)問(wèn)者的瀏覽器,能減少HTTP請(qǐng)求總數(shù)。
因此,我們要讓PHP緩沖輸出,默認(rèn)情況下,PHP已經(jīng)啟用了輸出緩沖功能,PHP緩沖4096字節(jié)的輸出之后才會(huì)把內(nèi)容發(fā)送給Web服務(wù)器,推薦配置如下:
output_buffering=4096
implicit_flush=false
如果想要修改輸出緩沖區(qū)的大小,確保使用的值是4(32位系統(tǒng))或8(64位系統(tǒng))的倍數(shù)。
安全設(shè)置
open_basedir:使用open_basedir選項(xiàng)能夠控制PHP腳本只能訪(fǎng)問(wèn)指定的目錄,這樣能夠避免PHP腳本訪(fǎng)問(wèn)不應(yīng)該訪(fǎng)問(wèn)的文件,一定程度上限制了phpshell的危害。我們一般可以設(shè)置為只能訪(fǎng)問(wèn)網(wǎng)站目錄:
open_basedir=/data/www
disable_functions:一般我們要禁止系
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 防疫兒歌考試題及答案
- 裝修公司裝修合同范本
- 口腔門(mén)診承包合同協(xié)議書(shū)
- 酒店盒飯合同協(xié)議書(shū)下載
- 紅娘合同協(xié)議書(shū)
- 婚紗店合同協(xié)議書(shū)
- 鋼材銷(xiāo)售合同協(xié)議書(shū)
- 加盟減肥合同協(xié)議書(shū)
- 解除洗滌合同協(xié)議書(shū)范本
- 協(xié)議書(shū)合同無(wú)效
- 雅思托福培訓(xùn)班合作協(xié)議
- 青少年健康體重管理調(diào)查報(bào)告
- uht牛奶工藝流程
- 腫瘤護(hù)理進(jìn)修匯報(bào)
- 《擴(kuò)散焊專(zhuān)題》課件
- 《音頻媒體》課件
- 《急性左心衰》課件
- 報(bào)價(jià)培訓(xùn)課件
- 2024年全球人類(lèi)發(fā)展指數(shù)排名發(fā)布
- 《家禽疾病的診斷》課件
- 中國(guó)科學(xué)技術(shù)大學(xué)簡(jiǎn)介
評(píng)論
0/150
提交評(píng)論