【CNMP系列】PHP配置和調優


上一節我們說到PHP5.6.30在CentOS7.0下的整個安裝過程,http://www.cnblogs.com/riverdubu/p/6428226.html

今天我來和大家講解一下PHP-FPM安裝的一些配置和調優。

PHP-FPM配置相關

再來解釋下php-fpm的概念,PHP-FPM(PHP FastCGI Process Manager的簡稱,意思是“PHP FastCGI進程管理器”),是用於管理PHP進程池的軟件,用於接收和處理來自Web服務器(例如nginx)的請求。

PHP-FPM軟件會創建一個主進程(通常以操作系統中根用戶的身份運行),控制何時以及如何把HTTP請求轉發給一個或多個子進程處理。

這個master process就是PHP-FPM的主進程。

PHP-FPM主進程還控制着什么時候創建和銷毀子進程,PHP-FPM進程池中的每一個進程存在的時間都比單個HTTP請求長。因為這章不是講進程的,所以,進程這個概念不在此贅述,不懂的朋友可以去百度好好了解下。

PHP-FPM的配置文件在/usr/local/php/etc/里面。打開該文件。

vim /usr/local/php/etc/php-fpm.conf

可以看到很多注釋掉的代碼段(這里的分號是注釋符)。vim快速查找單個單詞的方式,在非編輯模式,按'/'這個符號,輸入你想要查找的單詞,然后按'n'字母跳到下一個。

全局配置相關

先來解釋一下這兩個配置參數。

emergency_restart_threshold:在指定的一段時間內,如果失效的PHP-FPM子進程超過這個值,PHP-FPM子進程就重啟。emergency_restart_interval這個值就是指定的一段時間。這是PHP-FPM進程的基本安全保障,建議設置成如下值。

關鍵配置相關

各個PHP-FPM進程池都以指定的操作系統用戶和用戶組的身份運行,個人建議以單獨的非根用戶身份運行各個PHP-FPM進程池,這樣你在命令行中使用top的時候便於識別每個PHP的應用的PHP-FPM進程池。

PHP-FPM進程池監聽的IP地址和端口號。

擁有這個PHP-FPM進程池中子進程的系統用戶(組),要把這個設置的值設置成運行PHP應用的非根用戶的用戶(組)名。

可以向這個PHP-FPM進程池發送請求的IP地址(一個或多個),為了安全,我是將其設為本機或者注釋掉,如果你有需求,可以打開。

PHP-FPM進程池中最多能有多少進程。具體的進程數按照自己分配給php服務的內存決定,具體算法如下。

一共分配給PHP多少內存?我在阿里雲申請了一台2G內存的VPS,除去分配給Nginx,MySql,Memcache的內存,我覺得給PHP分配個512MB差不多。

單個PHP進程平均消耗多少內存?PHP進程一般消耗5~20MB的內存,上傳文件,圖像處理等另算。

能負擔起多少個PHP-FPM進程?做個簡單的除法,我發現此VPS能夠承擔30個左右的進程,如果你覺得這樣不夠,可以考慮增加服務器的內存數量。

PHP-FPM啟動時PHP-FPM進程池中立即可用的進程數。保持默認值即可,這么做是為了保證有2個進程,等待請求進入,不讓PHP應用的頭幾個HTTP請求等待PHP-FPM初始化進程池中的進程。

PHP應用空閑時PHP-FPM進程池中可以存在的進程數量最小值/最大值。

PHP-FPM進程池中每個進程最多能處理的HTTP請求數量,還是各位根據需求計算出來的。

日志,各位可以配置下,用於記錄處理時間超過n秒的HTTP請求信息,可以找出PHP慢的原因。

上面的n秒,一般設為5s。

保存退出,重啟PHP-FPM服務。

#service php-fpm restart

可能沒有日志文件,我們新建一個即可。

#mkdir -p /usr/local/php/log/
#touch /usr/local/php/log/www.log.slow

PHP調優原理

我們來分析一下每次HTTP請求時通常是如何處理PHP腳本的。

首先,nginx把http請求轉發給PHP-FPM,PHP-FPM再把請求交給某個PHP子進程處理。

PHP進程找到相應的PHP腳本后,讀取腳本,把PHP腳本編譯成操作碼(或字節碼)格式,然后執行編譯得到操作碼,生成響應。

最后,把HTTP響應發給nginx,nginx再把響應發給HTTP客戶端。

PHP調優計划

PHP解釋器在php.ini文件中配置和調優,首先,我們得找到php.ini文件的所在地。

我們回想一下昨天打開的那個phpinfo.php文件,獲取到php的一些信息,心細的朋友可能在里面就找到了php.ini的位置。

打開該文件。

#vim /usr/local/php/lib/php.ini

內存配置

比較科學的默認值,如果網站比較大,可以考慮到512M,如果只是一個個人網站,這個足夠,或者降到64M即可。

Zend OPcache配置

字節碼緩存不是PHP的新特性,很多獨立的擴展可以實現緩存,例如APC、eAccelerator、XCache。從PHP 5.5.0開始,PHP內置了字節碼緩存功能,名為Zend OPcache。

Zend OPcache會自動在內存中緩存預先編譯好的PHP字節碼,如果緩存了某個文件的字節碼,就執行對應的字節碼。PHP是解釋型的語言,PHP解釋器執行PHP腳本的時候會解析PHP腳本代碼,把PHP代碼編譯成一系列Zend操作碼,然后執行字節碼。就和C匯編轉機器碼一樣的,緩存的是可執行的字節碼。

如果php.ini文件中的opcache.validate_timestamps指令的值為0,Zend OPcache就會察覺不到PHP腳本的變化,我們必須要手動去清空Zend OPcache緩存的字節碼,讓它發現PHP文件的變動。

下面推薦一組Zend OPcache的配置:

只是推薦,針對每個打開的屬性,我下面做詳解。

首先,需要打開opcache。opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=0

; The OPcache shared memory storage size.
opcache.memory_consumption=64

為操作碼緩存分配的內存量。

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=16

用來存儲駐留字符串的內存量,何為駐留字符串,PHP解釋器在背后會找到相同字符串的多個實例,把這個字符串保存在內存中,如果再次使用相同的字符串,PHP解釋器就會使用指針這么做能節省內存。

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 100000 are allowed.
opcache.max_accelerated_files=4000

操作碼緩存中最多能存儲多少個PHP腳本。

; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=1

這個值設置為1時,經過一段時間后PHP會檢查PHP腳本的內容是否有變化。

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
opcache.revalidate_freq=0

設置PHP多久(時間是秒)檢查一次PHP腳本的內容是否有變化。這么設置會在每次請求時都重新驗證PHP文件,適用於線上生產環境。

; If enabled, a fast shutdown sequence is used for the accelerated code
opcache.fast_shutdown=1

這么設置能讓操作碼使用更快的停機過程,把對象析構和內存釋放交給Zend Engine的內存管理器完成。

最長執行時間

默認最長執行時間為30秒,PHP進程運行到30秒,那還不把Web應用的訪問者等死啊,所以我們不能讓訪問者等這么長時間,設置為5即可。如果要處理長時間的運行任務,放到單獨的進程中運行即可。

會話處理

如果大家對Memcache和Redis比較熟悉,可以將這里面的session存儲換成這兩種內存存儲,速度快,也便於以后大小的伸縮。

好的,關於PHP的配置和優化就先說到這里,如果各位需要對文件上傳、緩沖設置以及其他的相關設置,可以參見php.net,在官網上可以學到更多,還有什么不明白的,可以在評論區留言評論,我會一一給大家解答。^_^

注1

zend opcache的打開還需要新增一個配置屬性,在剛才的opcache區間內加入這句

zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/opcache.so

重啟php-fpm。重啟Nginx。即可在phpinfo里看到opcache的相關信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM