PHP-FPM长轮询配置
PHP-FPM long polling configuration
假设我对 php-fpm 有以下配置:
pm = dynamic
pm.start_servers = 10
pm.max_children = 400
pm.min_spare_servers = 8
pm.max_spare_servers = 16
pm.process_idle_timeout = 10s
假设每个用户都必须有一个无休止的长轮询请求。如果我有 10000 个多次请求的限制并且有 10000 个用户连接到我的网站,这是否意味着我的服务器将永远挂起?
另一个问题:servers
和children
与simultaneous requests
有什么关系?每个请求都会产生一个新进程吗? servers
和 children
有什么区别?据我了解,children
是进程。
PS:请不要推荐 Websockets 或任何其他技术。
谢谢。
当您将 PHP-FPM 与动态进程(默认和推荐值)一起使用时,您有这些选项:
; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives:
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; number then some children will be killed.
; Note: This value is mandatory.
回答你的问题,服务器和子进程是进程,每个进程将响应一个用户。您的服务器将支持最多 400 个并发连接。
我已经用长轮询实现了很多系统,它比在某个时间间隔刷新更有效并且使用更少的资源。
最大的问题是您的 PHP 进程会消耗您所有的服务器内存,我强烈建议您寻找任何替代方案。
我使用的一个很好的替代方法是 NGiNX HTTP Server Push module,您可以创建将信息推送给客户的脚本。使用此方法,您可以扩展到数千个并发客户端,这是无法直接使用 PHP.
完成的
举个例子,我做了一个电子邮件客户端,它有一个写在 PHP 中的守护进程,它使用这个 NGiNX 模块监控用户邮箱和推送新邮件通知,文件系统监控是使用PHP inotify,换句话说,我几乎使用了 0 系统资源,并创建了一个具有实时通知和非常低的网络和处理器使用率的网络邮件系统,仅使用 PHP 和长轮询或使用刷新计算量很大。
我知道你不想要 Websockets 的建议,但根据你的需求,它几乎无法避免。
假设我对 php-fpm 有以下配置:
pm = dynamic
pm.start_servers = 10
pm.max_children = 400
pm.min_spare_servers = 8
pm.max_spare_servers = 16
pm.process_idle_timeout = 10s
假设每个用户都必须有一个无休止的长轮询请求。如果我有 10000 个多次请求的限制并且有 10000 个用户连接到我的网站,这是否意味着我的服务器将永远挂起?
另一个问题:servers
和children
与simultaneous requests
有什么关系?每个请求都会产生一个新进程吗? servers
和 children
有什么区别?据我了解,children
是进程。
PS:请不要推荐 Websockets 或任何其他技术。
谢谢。
当您将 PHP-FPM 与动态进程(默认和推荐值)一起使用时,您有这些选项:
; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives:
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in 'idle'
; state (waiting to process). If the number
; of 'idle' processes is greater than this
; number then some children will be killed.
; Note: This value is mandatory.
回答你的问题,服务器和子进程是进程,每个进程将响应一个用户。您的服务器将支持最多 400 个并发连接。
我已经用长轮询实现了很多系统,它比在某个时间间隔刷新更有效并且使用更少的资源。
最大的问题是您的 PHP 进程会消耗您所有的服务器内存,我强烈建议您寻找任何替代方案。
我使用的一个很好的替代方法是 NGiNX HTTP Server Push module,您可以创建将信息推送给客户的脚本。使用此方法,您可以扩展到数千个并发客户端,这是无法直接使用 PHP.
完成的举个例子,我做了一个电子邮件客户端,它有一个写在 PHP 中的守护进程,它使用这个 NGiNX 模块监控用户邮箱和推送新邮件通知,文件系统监控是使用PHP inotify,换句话说,我几乎使用了 0 系统资源,并创建了一个具有实时通知和非常低的网络和处理器使用率的网络邮件系统,仅使用 PHP 和长轮询或使用刷新计算量很大。
我知道你不想要 Websockets 的建议,但根据你的需求,它几乎无法避免。