




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第PHP細數(shù)實現(xiàn)提高并發(fā)能力的方法目錄內(nèi)存優(yōu)化開啟ZendOPcache性能加速文件上傳執(zhí)行時間處理會話緩沖區(qū)安全設(shè)置本文已收錄編程學(xué)習(xí)筆記gitee。涵蓋PHP、JavaScript、Linux、Golang、MySQL、Redis和開源工具等等相關(guān)內(nèi)容。
用于生產(chǎn)環(huán)境中的PHP需要對其進行優(yōu)化,讓PHP自身發(fā)揮更好的性能,除了寫好PHP代碼,還要配置好php-fpm以及php.ini調(diào)優(yōu)。本文從內(nèi)存、OPcache、上傳、會話以及安全等方面講解php.ini的配置調(diào)優(yōu)。
PHP相對其他的編譯性語言,最大的缺點在于每次請求都會去做一些模塊解析,真正執(zhí)行的是work進程。work進程的開啟需要消耗更多的資源。同時,來一個請求都會去重新解析一些代碼,導(dǎo)致重復(fù)解析。
對于PHP的優(yōu)化,可以重點充這方面去考慮進行優(yōu)化。
內(nèi)存優(yōu)化
運行PHP時需要關(guān)心每個PHP進程要使用多少內(nèi)存,php.ini中的memory_limit設(shè)置用于設(shè)定單個PHP進程可以使用的系統(tǒng)內(nèi)存最大值。
這個設(shè)置的默認(rèn)值是128M,這對于大多數(shù)中小型PHP應(yīng)用來說或許合適,不過,如果運行的是微型PHP應(yīng)用,可以降低這個值,以便節(jié)省系統(tǒng)資源,反之,如果運行的是內(nèi)存集中型PHP應(yīng)用,可以增加這個值。這個值的大小由可用的系統(tǒng)內(nèi)存決定,確定給PHP分配多少值是一門藝術(shù),決定給PHP分配多少內(nèi)存,以及能負(fù)擔(dān)起多少個PHP-FPM進程時,可以根據(jù)以下維度信息進行判斷:
一共可以分配給PHP多少內(nèi)存?以一個2G內(nèi)存的VPS為例,這臺設(shè)備中可能還運行了其他進程,如MySQL、Nginx等,那么留512M給PHP是合適的。每個PHP進程平均耗費多少內(nèi)存?這個要監(jiān)控進程的內(nèi)存使用量,可以使用命令行命令top,也可以在PHP腳本中調(diào)用memory_get_peak_usage()函數(shù),不管使用哪種方式,都要多次運行同一個腳本,然后取內(nèi)存消耗的平均值。能負(fù)擔(dān)起多少個PHP-FPM進程?假設(shè)我給PHP分配了512M內(nèi)存,每個PHP進程平均耗費15M內(nèi)存,那么可以負(fù)擔(dān)起34個PHP-FPM進程。
有足夠的系統(tǒng)資源嗎?最后還需要確認(rèn)有足夠的系統(tǒng)資源運行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有三種運行模式,分別是固定進程數(shù)、按需進程數(shù)、完全動態(tài)進程數(shù)。
按需進程數(shù),默認(rèn)初始化幾個進程數(shù),如果進去量過大,動態(tài)創(chuàng)建一些新的進程數(shù),等請求結(jié)束之后,新創(chuàng)建的進程數(shù)在銷毀掉。固定進程數(shù),默認(rèn)固定幾個進程,如果進程數(shù)不夠的情況時,新的請求處于等待中,直到其他的進程處理完畢才會處理新的請求。完全動態(tài)進程數(shù),表示完全由請求量控制,來一個請求創(chuàng)建一個進程,處理完畢在銷毀掉。
開啟ZendOPcache性能加速
確定要分配多少內(nèi)存后,就可以配置PHP的ZendOPcache擴展。OPcache主要是將一些代碼解析成字節(jié)碼,在后續(xù)的請求中就無需重復(fù)去解析、編譯這部分代碼。減少編譯、解析的過程,也能提高PHP的處理速度。
PHP5.5.0+內(nèi)置了這個擴展,下面羅列幾項必要的配置信息:
opcache.memory_consumption=64:為操作碼緩存分配的內(nèi)存(單位是MB),分配的內(nèi)存量應(yīng)該可以保存應(yīng)用中所有PHP腳本編譯得到的操作碼,這個值根據(jù)應(yīng)用的體量可以設(shè)置成不同大小的值。
erned_strings_buffer=16:用來存儲駐留字符串的內(nèi)存量(單位是MB),什么是駐留字符串呢?PHP解釋器在背后會找到相同字符串的多個實例,把這個字符串保存在內(nèi)存中,如果再次使用相同的字符串,PHP解釋器會使用指針,這么做的目的是節(jié)省內(nèi)存。默認(rèn)情況下,PHP駐留字符串會隔離在各個PHP進程中,這個設(shè)置能讓PHP-FPM進程池把所有進程駐留字符串存儲到共享的緩沖區(qū)中,以便在PHP-FPM進程池中的多個進程之間引用駐留字符串,這樣能節(jié)省更多內(nèi)存。
opcache.max_accelerated_files=4000:操作碼緩存中最多能存儲多少個PHP腳本,這個值的區(qū)間是2000到100000之間,這個值一定要比PHP應(yīng)用中的文件數(shù)大。
opcache.validate_timestamps=1:這個設(shè)置的值為1時,經(jīng)過一段時間后PHP會檢查PHP腳本的內(nèi)容是否有變化,檢查的時間間隔由opcache.revalidate_freq設(shè)置指定。如果這個設(shè)置的值為0,PHP不會檢查PHP腳本的內(nè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時,才會在每次請求時都重新驗證PHP文件,因此,在開發(fā)環(huán)境中每次都會重新驗證PHP文件,在生產(chǎn)環(huán)境中則不驗證。
opcache.fast_shutdown=1:這么設(shè)置能讓操作碼使用更快的停機步驟,把對象析構(gòu)和內(nèi)存釋放交給ZendEngine的內(nèi)存管理器完成。
文件上傳
如果你的應(yīng)用允許上傳文件,最好設(shè)置最大能上傳的文件大小。除此之外,最好還要設(shè)置最多能同時上傳多少個文件:
file_uploads=1
upload_max_filesize=10M
max_file_uploads=3
默認(rèn)情況下,PHP允許在單次請求中上傳20個文件,上傳的文件最大為2MB,這里我設(shè)置為單次請求最多只能上傳3個文件,每個文件最大為10MB,這個值不要設(shè)置太大,否則會出現(xiàn)超時。
注:如果非要上傳大文件,Web服務(wù)器的配置也要做相應(yīng)調(diào)整。除了在php.ini中設(shè)置之外,還要調(diào)整Nginx虛擬主機配置中的client_max_body_size設(shè)置。
此外,如果是上傳特大文件,我建議使用Webuploader專門的上傳組件,前端對大文件進行切片,后端php對分片數(shù)據(jù)進行合并還原文件。有關(guān)WebUploader應(yīng)用請參考本站文章:功能強大的文件上傳組件-WebUploader。
執(zhí)行時間
max_execution_time用于設(shè)置單個PHP進程在終止之前最長可運行時間。這個設(shè)置默認(rèn)是30秒,建議將其設(shè)置為5秒:
max_execution_time=5
在PHP腳本中可以調(diào)用set_limit_time()函數(shù)覆蓋這個設(shè)置。
假設(shè)我們想要生成報告,并把結(jié)果制作成PDF文件,這個任務(wù)可能要花10分鐘才能完成,而我們肯定不想讓PHP請求等待10分鐘,我們應(yīng)該單獨編寫一個PHP文件,讓其在單獨的后臺進程中執(zhí)行,Web應(yīng)用只需幾毫秒就可以派生一個單獨的后臺進程,然后返回HTTP響應(yīng)。
實際上,我們在跑需要消耗大量時間來完成的任務(wù),一般采用后臺進程方式,比如我們可以使用PHP的swoole擴展來生成報表、批量發(fā)送郵件耗時長的任務(wù)。
處理會話
PHP默認(rèn)的情況是將會話產(chǎn)生的信息存在磁盤中,例如所謂的session信息。在創(chuàng)建和讀取session時,都會對磁盤進行I/O操作,讀寫磁盤其實是比較耗時的一個操作。并且session不方便做分布式應(yīng)用的會話機制處理。推薦可以放在Redis、memcached這樣的內(nèi)存性服務(wù)中,讀寫速度快,并且可以做分布式會話機制處理。
下面舉例將session這樣的信息,存儲在memcached內(nèi)存中。
session.save_handler="memcached"
session.save_path="服務(wù)地址:端口號"
緩沖區(qū)
如果是在較少的塊中發(fā)送更多數(shù)據(jù),而不是在較多的塊中發(fā)送較少的數(shù)據(jù),那么網(wǎng)絡(luò)的效率會更高,也就是說,在較少的片段中把內(nèi)容傳遞給訪問者的瀏覽器,能減少HTTP請求總數(shù)。
因此,我們要讓PHP緩沖輸出,默認(rèn)情況下,PHP已經(jīng)啟用了輸出緩沖功能,PHP緩沖4096字節(jié)的輸出之后才會把內(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選項能夠控制PHP腳本只能訪問指定的目錄,這樣能夠避免PHP腳本訪問不應(yīng)該訪問的文件,一定程度上限制了phpshell的危害。我們一般可以設(shè)置為只能訪問網(wǎng)站目錄:
open_basedir=/data/www
disable_functions:一般我們要禁止系
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年住院醫(yī)師規(guī)范培訓(xùn)(各省)-甘肅住院醫(yī)師血液內(nèi)科歷年參考題庫含答案解析(5卷單項選擇題100題)
- 2025-2030全球及中國光纖接口行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 2025-2030全球及中國乘客服務(wù)系統(tǒng)(PSS)行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 2025-2030全球及中國AI銷售助理軟件行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告
- 2025年住院醫(yī)師規(guī)范培訓(xùn)(各省)-廣西住院醫(yī)師臨床病理科歷年參考題庫含答案解析(5卷單選100題)
- 2025年住院醫(yī)師規(guī)范培訓(xùn)(各省)-廣西住院醫(yī)師中醫(yī)全科歷年參考題庫含答案解析(5卷100題)
- 2025-2030中國飼料調(diào)味劑行業(yè)發(fā)展分析及投資前景預(yù)測研究報告
- 2025-2030中國藝術(shù)品行業(yè)發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025年住院醫(yī)師規(guī)范培訓(xùn)(各省)-北京住院醫(yī)師全科醫(yī)學(xué)歷年參考題庫含答案解析(5卷100題)
- 2025-2030中國紅酒連鎖行業(yè)市場運行分析及競爭策略與投資前景研究報告
- 品牌授權(quán)使用協(xié)議合同書
- 2024年天津市公安局濱海分局招聘警務(wù)輔助人員考試真題
- 報廢汽車回收拆解前景
- 2025年廣東省中考生物試卷真題(含答案解析)
- 2025至2030停車場項目發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 第10課+遼夏金元的統(tǒng)治(大概念教學(xué)課件)2024-2025學(xué)年高一歷史上冊教學(xué)課件(統(tǒng)編版2019)
- 裝置保運方案(3篇)
- 中國聚丙烯酰胺行業(yè)市場發(fā)展分析及前景趨勢與投資研究報告2025-2028版
- 青年教師教學(xué)工作坊組織計劃
- 駐非洲員工管理制度
- 2025年高考真題-物理(江蘇卷) 含答案
評論
0/150
提交評論