PHP-FPM 主要提供 TCP socket 及 Unix socket 兩種協議連接的方式,但很少人知道其優缺點。

1. 理論上 Unix socket 比 TCP socket 快

TCP socket 是執行標準的網路協議,因此具有網路協議的開銷,而 Unix socket 則是直接調用作業系統的函式,所以理論上會比 TCP socket 來得快。

在我的實測環境中,採用 Unix socket 確實比 TCP socket 快 10% (500qps to 550qps)。

2. Unix socket 限於本機

因為 Unix socket 是作業系統調用函式,所以只能限於本機,但網路協議的 TCP socket 則可以交由另機處理。

3. Unix socket 在系統承載量高時,穩定性不如 TCP socket

這點就比較少人知道了。雖然 TCP socket 因為是標準的網路協議而較耗時,但也因此擁有了 TCP 的特性 - re-transmission,這是 Unix socket 沒有的保險機制。

因此當系統承載量高時,無法處理的 PHP request 會暫時丟在 backlog;若 backlog 也滿載時,Unix socket 會直接回應失敗,但 TCP socket 會嘗試重試,直到成功或逾時。

補充:設定方式

Unix socket

listen = /var/run/php-fpm/php-fpm.socket
listen.backlog = 65535

TCP socket

listen = 127.0.0.1:9000
listen.backlog = 65535