編程學(xué)習(xí)網(wǎng) > PHP技術(shù) > php中級(jí) > php.ini配置文件參數(shù)優(yōu)化
2020
05-08

php.ini配置文件參數(shù)優(yōu)化

用于生產(chǎn)環(huán)境中的PHP需要對(duì)其進(jìn)行優(yōu)化,讓PHP自身發(fā)揮更好的性能,除了寫好PHP代碼,還要配置好php-fpm以及php.ini調(diào)優(yōu)。 本文從內(nèi)存、OPcache、上傳、會(huì)話以及安全等方面講解php.ini的配置調(diào)優(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)用來說或許合適,不過,如果運(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)行判斷:

  1. 一共可以分配給 PHP 多少內(nèi)存?以一個(gè) 2G 內(nèi)存的 VPS 為例,這臺(tái)設(shè)備中可能還運(yùn)行了其他進(jìn)程,如 MySQL、Nginx 等,那么留 512M 給 PHP 是合適的。
  2. 每個(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)存消耗的平均值。
  3. 能負(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)程。
  4. 有足夠的系統(tǒng)資源嗎?最后還需要確認(rèn)有足夠的系統(tǒng)資源運(yùn)行 PHP 應(yīng)用并處理預(yù)期的流量。

 

開啟Zend OPcache性能加速

PHP屬于解釋型語言,在執(zhí)行代碼過程中,翻譯器并不產(chǎn)生目標(biāo)機(jī)器代碼,而是產(chǎn)生易于執(zhí)行的中間代碼,這種中間代碼每執(zhí)行一次就翻譯一次,通常會(huì)導(dǎo)致執(zhí)行效率較低,而在PHP7中可以直接開啟Opcache來進(jìn)行性能優(yōu)化和加速。
PHP 5.5+版本以上的,可以使用PHP自帶的opcache開啟性能加速(默認(rèn)是關(guān)閉的),PHP5.5之后opcache可以直接--enable-opcache。對(duì)于PHP 5.5以下版本的,可以使用APC來進(jìn)行緩存。

 

配置Opcache

zend_extension=opcache.so

;(網(wǎng)上很多資料使用engine = On來,是window下的php)

opcache.enable=1

;設(shè)置多少內(nèi)存緩存opcode,單位M。如果內(nèi)存不夠用,就會(huì)出現(xiàn)一些php文件緩存不到的情況。解決辦法是設(shè)置緩存到文件中去

opcache.memory_consumption=128

;最大允許緩存多少個(gè)php文件,需要根據(jù)項(xiàng)目的文件數(shù)來定。這個(gè)值一定要比 PHP 應(yīng)用中的文件數(shù)大。最大支持100萬個(gè)文件

opcache.max_accelerated_files=4000

;這個(gè)設(shè)置的值為1時(shí),經(jīng)過一段時(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.validate_timestamps=0

;驗(yàn)證時(shí)間戳的頻率。單位是秒。;此選型依賴于opcache.vilidate_timestamps=1(開啟檢查機(jī)制),才生效

opcache.revalidate_freq = 60

;字符串駐留技術(shù)使用多少內(nèi)存,設(shè)置為8M,這是默認(rèn)值。

opcache.interned_strings_buffer = 16

;快速釋放內(nèi)存,推薦開啟,節(jié)省資源。php-7.2.0開始,不需要配置,已集成在php引擎中

opcache.fast_shutdown=1

;設(shè)置:是不是只使用文件來緩存opcode,不使用內(nèi)存緩存。建議:關(guān)掉。最好內(nèi)存和文件都同時(shí)使用

opcache.file_cache_only=false

;將內(nèi)存中緩存的opcdoe,備份到磁盤文件中。這樣好處,重啟服務(wù)器時(shí),可以避免重新生成了。注意目錄的權(quán)限要設(shè)對(duì),設(shè)置php引擎所屬linux用戶能夠?qū)懭搿?shí)測,若權(quán)限不夠,并不會(huì)報(bào)錯(cuò),只是緩存不進(jìn)去

opcache.file_cache=/apps/php-7.1.7/opcode_file_cache

 

文件上傳

如果你的應(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)程在終止之前最長可運(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í)間來完成的任務(wù),一般采用后臺(tái)進(jìn)程方式,比如我們可以使用PHP的swoole擴(kuò)展來生成報(bào)表、批量發(fā)送郵件耗時(shí)長的任務(wù)。

 

處理會(huì)話

PHP 默認(rèn)的會(huì)話處理程序會(huì)拖慢大型應(yīng)用,因?yàn)檫@個(gè)處理程序會(huì)把會(huì)話數(shù)據(jù)存儲(chǔ)在硬盤中,需要?jiǎng)?chuàng)建不必要的磁盤 I/O,浪費(fèi)時(shí)間。我們應(yīng)該把會(huì)話數(shù)據(jù)保存在內(nèi)存中,例如可以使用 Memcached 或 Redis。這么做還有個(gè)額外好處 —— 以后便于伸縮。如果會(huì)話數(shù)據(jù)存儲(chǔ)在硬盤中,不便于增加額外的服務(wù)器,如果把會(huì)話數(shù)據(jù)存放在 Memcached 或 Redis 里,任何一臺(tái)分布式 PHP-FPM 服務(wù)器都能訪問會(huì)話數(shù)據(jù)。
如果想把會(huì)話數(shù)據(jù)保存在 Memcached 中,需要做如下配置:
session.save_handler = 'memcached'
session.save_path = '127.0.0.1:11211'

 

緩沖輸出

如果是在較少的塊中發(fā)送更多數(shù)據(jù),而不是在較多的塊中發(fā)送較少的數(shù)據(jù),那么網(wǎng)絡(luò)的效率會(huì)更高,也就是說,在較少的片段中把內(nèi)容傳遞給訪問者的瀏覽器,能減少 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ù)。

 

安全

open_basedir:使用open_basedir選項(xiàng)能夠控制PHP腳本只能訪問指定的目錄,這樣能夠避免PHP腳本訪問不應(yīng)該訪問的文件,一定程度上限制了phpshell的危害。我們一般可以設(shè)置為只能訪問網(wǎng)站目錄:

open_basedir = /data/www

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

disable_functions = passthru,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

①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ò)誤信息記錄下來,便于查找服務(wù)器運(yùn)行的原因。
④error_log:設(shè)置PHP錯(cuò)誤日志存放的目錄。

 

掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料

Python編程學(xué)習(xí)

查 看2022高級(jí)編程視頻教程免費(fèi)獲取