PHP細(xì)數(shù)實(shí)現(xiàn)提高并發(fā)能力的方法_第1頁(yè)
PHP細(xì)數(shù)實(shí)現(xiàn)提高并發(fā)能力的方法_第2頁(yè)
PHP細(xì)數(shù)實(shí)現(xiàn)提高并發(fā)能力的方法_第3頁(yè)
PHP細(xì)數(shù)實(shí)現(xiàn)提高并發(fā)能力的方法_第4頁(yè)
PHP細(xì)數(shù)實(shí)現(xiàn)提高并發(fā)能力的方法_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論