簡介
從PHP 5.4 RC2開始,php-fpm已經轉正了,不再被php團隊標註為EXPERIMENTAL(實驗性的東西) 。
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 選項
分類: 方便
這個選項能讓你跟蹤執行緩慢的腳本並把他們連同調用棧一起記錄在日誌檔案中。例如如下設定:
<value name="request_slowlog_timeout">5s</value>
<value name="slowlog">logs/slow.log</value>
正如你再例子中看到的,腳本運行了 5 秒以上,並很可能是由於 mysql 回響慢造成的(top backtrace)。
FAQ
Q:php-fpm 可以和 ZendOptimize 一起用嗎?
A:完全可以。
Q:php-fpm 可以和 ZendPlatform、xcache、eAccelerator、APC 等的最佳化器一起用嗎?
A:是的。php-fpm 的架構和任何一種用於高速 opcode 快取的共享記憶體都適用。唯一的限制是:所有的 worker 進程只能適用一個快取,即使它們用不同的 uid/gid 運行
Q:為什麼我要給php打補丁呢?spawn-fcgi 不需要這樣!
A:php-fpm 的創建是為了增強方便管理。沒有打過補丁的php不能做到:
平滑重啟php而不丟失請求,包括升級 php二進制檔案以及/或者 擴展。
用不同的 uid / gid / chroot 環境運行 worker 進程
所有的設定只有一個配置檔案
根據負載動態請求 (TODO)
對php請求實時統計性能 (TODO)
Q:為什麼要用 root 運行php-fpm 呢?這安全嗎?
A:用 root 啟動php-fpm 只有在你打算用不同 uid/gid 的 php 來處理請求時才有意義。比如,在共享主機上的不同站點。因為只有在 master 進程用 root 運行的時候,才可以建立不同 uid/gid 的子進程。這是相當安全的。master 進程自己從來不會去處理請求。
在任何情況下,php-fpm 都不會用 root 身份來處理請求。
Q:php-fpm 可以加速 php 腳本處理速度嗎?
A:不,它不會影響處理速度。不過,如果你使用一些特殊特性,對於一些特定的請求還是可以有性能提升的。
Q:如果我把我的網站從 mod_php遷移到php-fpm ,我會得到性能提升嗎?
A:通常,當有伺服器上有大量空閒記憶體可用時,能從遷移到 php-fpm 中得到的性能提升可能不大。但是如果記憶體並不充裕,性能提升還是很可觀的,在某些情況下可以達到 300-500%。這可能是由於 nginx +php-fpm 一般會比 Apache + mod_php 使用更少的記憶體。而且 VFS 快取會由於更多的空餘記憶體而更有效地工作。
Q:php-fpm 將來會被官方的 php 包含嗎?
A:我希望如此。php-fpm 代碼採用的是GPL許可證 。所以現在php-fpm 的代碼與 php 協定(類似BSD許可證)並不匹配 。這是臨時性措施。這樣的選擇是為了簡化開發過程。一旦代碼的功能完備,比如自適應生成子進程和其他一些東西,協定會改為一個相匹配的。之後,php-fpm 會正式發布給 php 開發團隊,並被建議包含。
文檔
php-fpm 已經在 Linux、MacOSX、Solaris 和 FreeBSD 上測試通過。
確信 libxml2(在某些系統上叫做libxml2-devel)已經安裝。
下載最小的 php 和php-fpm
$ bzip2 -cdphp-5.2.5.——tar.——bz2 | tar xf -
$ gzip -cdphp-5.2.5-fpm-0.5.7.diff.gz | patch -d php-5.2.5 -p1
$ cdphp-5.2.5 && ./configure --enable-fastcgi--enable-fpm
$ make all install
編輯 $prefix/etc/php-fpm.conf
運行 $prefix/bin/php-cgi --fpm
仔細檢查 $prefix/logs/php-fpm.log
運行phpinfo() 檢查你的網站是否還正常運行
master 進程的 pid 被存放在 $prefix/logs/php-fpm.pid
master進程可以理解以下信號:
SIGINT, SIGTERM | 立刻終止 |
SIGQUIT | 平滑終止 |
SIGUSR1 | 重新打開日誌檔案 |
SIGUSR2 | 平滑重載所有worker進程並重新載入配置和二進制模 |
關於
我的名字叫 Andrei Nigmatulin, 我是php-fpm 的作者。
從 2004 年開始,我就在等有什麼人讓 PHP FastCGI 能滿足產品環境,但我等不下去了。
php-fpm 是在數個項目中使用 PHP 的 FastCGI SAPI 中的知識、經驗和想法的產物。
php-fpm 可以在 GPL 協定下用在公共用途。和 php-fpm 綁定的修改版的libevent是在 BSD 協定下發布的。
我需要得到您的反饋——新的想法和建議——來改進和最佳化phpFastCGI SAPI。 如果您有什麼想法、意見、補充和建議,我會很高興,很原意聽取,也許還會實現他們。給給我發郵件吧。(地址在本頁的末尾)。
如果你想支持php-fpm 的開發,可以作一些捐贈: Paypal Yandex.Money
譯註:
php-fpm還帶有一個更方便的腳本,在$prefix/sbin/php-fpm。可以用php-fpm start|graceful|restart|stop來維護。稍編輯一下就可以讓它使用配置檔案。