PHP-FPM长轮询配置

时间:2018-10-19 20:28:32

标签: php fpm

假设我对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个用户,这是否意味着我的服务器将永远挂起?

另一个问题:serverschildrensimultaneous requests有何关系?每个请求都会产生一个新进程吗? serverschildren有什么区别?据我了解,children是过程。

PS:请不要建议Websockets或任何其他技术。

谢谢。

1 个答案:

答案 0 :(得分:1)

在动态过程中使用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个并发连接。

我已经用longpolling实现了许多系统,与按一定时间间隔刷新相比,longpolling效率更高并且使用的资源更少。

最大的问题是您的PHP进程将占用您所有的服务器内存,因此我强烈建议您寻找任何替代方法。

我使用的一个不错的选择是NGiNX HTTP Server Push module,您可以创建将信息推送到客户的脚本。使用这种方法,您可以扩展到数千个并发客户端,这是不可能直接使用PHP做到的。

例如,我制作了一个电子邮件客户端,该客户端具有用PHP编写的守护程序,该守护程序使用此NGiNX模块监视用户邮箱并推送新电子邮件的通知,并且文件系统监视使用PHP inotify完成,换句话说,我使用了几乎0的系统资源,并创建了一个具有实时通知功能且网络和处理器使用率非常低的Webmail系统,仅使用PHP和longpolling或使用refresh会导致计算量大。

我知道您不希望Websockets建议,但是根据您的需求,它几乎无法避免。