PHP怎么實(shí)現(xiàn)提高并發(fā)能力

這篇文章主要介紹了PHP怎么實(shí)現(xiàn)提高并發(fā)能力的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇PHP怎么實(shí)現(xiàn)提高并發(fā)能力文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

創(chuàng)新互聯(lián)憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、做網(wǎng)站、成都做網(wǎng)站、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十余年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上千中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。

內(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 分配多少值是一門藝術(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配置文件。

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; The maximum number of processes FPM will fork. This has been designed to control
; the global number of processes when using dynamic PM within a lot of pools.
; Use it with caution.
; Note: A value of 0 indicates no limit
; Default Value: 0
; process.max = 128

; Specify the nice(2) priority to apply to the master process (only if set)
; The value can vary from -19 (highest priority) to 20 (lowest priority)
; Note: - It will only work if the FPM master process is launched as root
;       - The pool process will inherit the master process priority
;         unless specified otherwise
; Default Value: no set
; process.priority = -19

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: 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ù)在銷毀掉。

  • 固定進(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)程,處理完畢在銷毀掉。

開啟Zend OPcache性能加速

確定要分配多少內(nèi)存后,就可以配置 PHP 的 Zend OPcache 擴(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è)置成不同大小的值。

opcache.interned_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)手清除緩存的操作碼。建議在開發(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 文件,因此,在開發(fā)環(huán)境中每次都會(huì)重新驗(yàn)證 PHP 文件,在生產(chǎn)環(huán)境中則不驗(yàn)證。

opcache.fast_shutdown = 1:這么設(shè)置能讓操作碼使用更快的停機(jī)步驟,把對(duì)象析構(gòu)和內(nèi)存釋放交給 Zend Engine 的內(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專門的上傳組件,前端對(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ú)編寫一個(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ì)話

PHP默認(rèn)的情況是將會(huì)話產(chǎn)生的信息存在磁盤中,例如所謂的session信息。在創(chuàng)建和讀取session時(shí),都會(huì)對(duì)磁盤進(jìn)行I/O操作,讀寫磁盤其實(shí)是比較耗時(shí)的一個(gè)操作。并且session不方便做分布式應(yīng)用的會(huì)話機(jī)制處理。推薦可以放在redis、memcached這樣的內(nèi)存性服務(wù)中,讀寫速度快,并且可以做分布式會(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)容傳遞給訪問(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腳本只能訪問(wèn)指定的目錄,這樣能夠避免PHP腳本訪問(wèn)不應(yīng)該訪問(wèn)的文件,一定程度上限制了phpshell的危害。我們一般可以設(shè)置為只能訪問(wèn)網(wǎng)站目錄:

open_basedir = /data/www

disable_functions:一般我們要禁止系統(tǒng)函數(shù)和禁止任何文件和目錄的操作,如:

disable_functions = '.....'

expose_php = Off:將此項(xiàng)設(shè)置為false即不會(huì)再header頭輸出PHP版本信息。

display_errors = Off:生產(chǎn)環(huán)境中,我們應(yīng)該禁止錯(cuò)誤提示,如果是本地開發(fā)環(huán)境,可以設(shè)置為On。

log_errors = On:建議在關(guān)閉display_errors后能夠把錯(cuò)誤信息記錄下來(lái),便于查找服務(wù)器運(yùn)行的原因。

error_log:設(shè)置PHP錯(cuò)誤日志存放的目錄。

關(guān)于“PHP怎么實(shí)現(xiàn)提高并發(fā)能力”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“PHP怎么實(shí)現(xiàn)提高并發(fā)能力”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:PHP怎么實(shí)現(xiàn)提高并發(fā)能力
當(dāng)前鏈接:http://muchs.cn/article24/ipjcce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、品牌網(wǎng)站制作ChatGPT、網(wǎng)站收錄、定制網(wǎng)站、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)