簡介
PHP-FPM其實是PHP原始碼的一個補丁,旨在將FastCGI進程管理整合進PHP包中。必須將它patch到你的PHP原始碼中,在編譯安裝PHP後才可以使用。
現在我們可以在最新的PHP 5.3.2的源碼樹裡下載得到直接整合了PHP-FPM的分支,據說下個版本會融合進PHP的主分支去。相對Spawn-FCGI,PHP-FPM在CPU和記憶體方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。
PHP5.3.3已經整合 php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP 進程管理方式,可以有效控制 記憶體和 進程、可以平滑 重載PHP配置,比spawn-fcgi具有更多優點,所以被PHP官方收錄了。在./configure的時候帶 ?enable-fpm參數即可開啟PHP-FPM。
使用PHP-FPM來控制PHP-CGI的FastCGI進程
/usr/local/ php/sbin/ php-fpm{start|stop|quit|restart|reload| logrotate}
--start 啟動 php的 fastcgi進程
--stop 強制終止 php的 fastcgi進程
--quit 平滑終止 php的 fastcgi進程
--restart 重啟 php的 fastcgi進程
--reload 重新平滑載入 php的 php.ini
--logrotate 重新啟用log檔案
特色功能
所有這些特性都是“不打斷”的方式實現的。也就是說,如果你不使用它們,它們的存在不會影響 php的功能性??他們都是“透明”的。
Error header
範圍: php.ini 選項
分類:便利性
預設情況下,如果被訪問的 php指令碼包含語法錯誤,使用者會收到一個空的“200 ok”頁。這是不方便的。Error header 這個 php.ini 選項允許在這種情況下產生一個 HTTP 錯誤碼,比如“HTTP/1.0 550 Server Made Big Boo”,從而中斷web server請求並顯示一個正確的錯誤頁。
如果要實現這樣的功能,需要在 php.ini 中添加一條 fastcgi.error_header = "HTTP/1.0 550 Server Made Big Boo"
在 php-5.2.4 中添加了類似,但不相同的功能:如果被訪問的php指令碼包含語法錯誤,並且 display_errors = off,會立刻返回“HTTP/1.0 500 Internal Server Error”。
如果你需要設定一個 503 錯誤,或者想要使這個行為獨立於 display_errors 的設定,那麼可以使用 fastcgi.error_header。如果你在 php-5.2.5 或以上版本上啟用 php-fpm,那麼 fastcgi.error_header的優先順序更高。
最佳化的上傳支援
實質:web server 支援
類型:最佳化
這個特性正如名字那樣,可以加速對大 POST 請求的處理速度,包括檔案上傳。最佳化是通過將請求體已寫入一個臨時檔案,然後 fastcgi協議傳遞檔案名稱而不是請求體到來實現的。目前就我所知,只有 nginx0.5.9 以上才支援這個功能。顯然,這種模式只在 php和 web server 在一台機器上的時候才能用。
nginx 範例配置:
location ~ \. php$ {
fastcgi_pass_request_body off;
client_body_in_file_only clean;
fastcgi_param REQUEST_BODY_FILE $request_body_file;
...
fastcgi_pass ...;
}
在 php中不需要配置任何東西。如果 php收到了參數REQUEST_BODY_FILE,就讀取其中的請求體,如果沒有,就自行從 fastcgi協議中讀取請求體。
結合這個特性,可以考慮對 臨時檔案使用記憶體檔案系統,例如tmpfs(linux):
client_body_temp_path /dev/shm/client_body_temp;
fastcgi_finish_request()
範圍: php函數
類型:最佳化
這個特性可以提高一些 php請求的處理速度。如果有些處理可以在頁面產生完後進行,就可以使用這種最佳化。比如,在 memcached 中儲存 session 就可以在頁面交給 web server 後進行。 fastcgi_finisth_request() ,這一特性可以結束響應輸出,web server 可以立即開始交給等不及的用戶端,而此刻, php可以在請求的上下文環境中處理許多事情。比如儲存session,轉換上傳的視頻,處理統計等等。
fastcgi_finisth_request() 會觸發 shutdown 函數運行。
request_slowlog_timeout
範圍: php-fpm.conf 選項
分類: 方便
這個選項能讓你跟蹤執行緩慢的指令碼並把他們連同調用棧一起記錄再記錄檔中。例如如下設定:
5s
logs/slow.log
正如你再例子中看到的,指令碼運行了 5 秒以上,並很可能是由於 mysql 響應慢造成的(top backtrace)。