上一節我們說到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的相關信息。