PHP 官方文件對於 FPM_BACKLOG_DEFAULT 的預設值說明並非正確,而且新版 PHP 對預設值也有所修正。

PHP 官方文件的錯誤

近幾年的 PHP 執行環境幾乎都會使用官方 PHP-FPM 模組,但是官方的錯誤內容,令使用者容易忽略其重要性,而無法順利發揮 PHP 的最大效能。

default-value-of-fpm-backlog-on-php-official-site

根據上圖的官方文件指出,當 listen.backlog 設定為 -1 時,代表著 unlimited (無上限) 的意思。

但我們從 PHP 的原始碼 (sapi/fpm/fpm/fpm_sockets.h) 中得知,若作業系統環境不是 FreeBSD 或 OpenBSD 的話,預設值就是 128,而這個值根本就不足以支持流量大的網站。

/*
  On FreeBSD and OpenBSD, backlog negative values are truncated to SOMAXCONN
*/
#if (__FreeBSD__) || (__OpenBSD__)
#define FPM_BACKLOG_DEFAULT -1
#else
#define FPM_BACKLOG_DEFAULT 128
#endif

PHP 原始碼的更正

然而,官方 PHP 在 2013-10-27 釋出了一個 更新 將之修正為 65535,如下:

/*
  On FreeBSD and OpenBSD, backlog negative values are truncated to SOMAXCONN
*/
#if (__FreeBSD__) || (__OpenBSD__)
#define FPM_BACKLOG_DEFAULT -1
#else
#define FPM_BACKLOG_DEFAULT 65535
#endif

影響的版本

雖然修正發生在 2013-10-27,但僅影響 PHP 5.5 系列的版本。也就是僅有 PHP 5.5.6 (含) 之後的版本才有此修正,其它如 PHP 5.5.5 或是目前任何 PHP 5.4 系列都沒有。所以若使用這些未修正的版本,還是建議依照傳統作法,額外調整該設定值較好。

listen.backlog = 65535